【问题标题】:My PHP curl Post request didnt work as expected我的 PHP curl Post 请求没有按预期工作
【发布时间】:2021-04-07 20:00:18
【问题描述】:

我尝试使用以下代码向另一个 php 页面发送 post 请求:

$vars = ['val1' => 'myval'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_MAXREDIRS, 4);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
$data = curl_exec($ch);
curl_close($ch);

但在目标页面上, var_dump($_POST); 只会输出“1”。我曾期待过这样的事情: array(val1 = myval) 或类似的东西。这样我就可以检查isset($_POST["val1"]) 是否存在并包含“myval”。

你知道请求有什么问题吗?

编辑: 我现在已将代码更改为以下内容:

<?php
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'cow'=>'milk',
    'php'=>'hypertext processor');
$ch=curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, "target.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

在target.php中:

<?php
echo print_r($_POST, true));
?>

但是没有回应。两个文件都在服务器的同一个目录中。

【问题讨论】:

  • 这应该可以。如何检查 post-request 的响应是什么?

标签: php curl post


【解决方案1】:

我想,我明白了。当我将“target.php”之类的东西设置为目标时,没有发送数据。但是当我使用完整的 URL 时,例如 https://myserver.com/target.php,这将按预期工作。有时,这很容易……抱歉占用了您的时间。

【讨论】:

    【解决方案2】:

    如果您使用的是CURLOPT_POSTFIELDS,则也不需要设置CURLOPT_POST。事实上,之后设置它会导致发送一个可能不正确的标头。

    CURLOPT_POSTFIELDS 接受一个数组,并将 Content-Type 标头设置为 multipart/form-data(如果提供)。稍后,设置CURLOPT_POST 会将其覆盖为application/x-www-form-urlencoded,这意味着另一端的PHP 脚本将期望编码为HTTP 查询字符串的数据。这就是您遇到问题的原因。

    您可以通过在发送之前正确编码$vars(使用http_build_query,如另一个答案)来解决此问题,或者只是删除设置CURLOPT_POST的调用。我推荐后者。

    【讨论】:

    • 是的 C API...不是! ;)
    【解决方案3】:

    那是因为curl_setopt() 不接受像array 这样的复杂类型;)您需要以查询字符串的形式呈现您的数据:"postvar1=value1&amp;postvar2=value2&amp;postvar3=value3"

    $format = http_build_query($vars);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $format);
    

    $format = "val1=my-value"; // be careful to create proper encoding
    curl_setopt($ch, CURLOPT_POSTFIELDS, $format);
    

    【讨论】:

    • 根据the docs,它也可以是一个数组。
    • 你是对的。 “将数组传递给CURLOPT_POSTFIELDS 会将数据编码为multipart/form-data,而传递一个URL 编码的字符串会将数据编码为application/x-www-form-urlencoded。”
    猜你喜欢
    • 2015-04-11
    • 2019-12-20
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多