CURL Post 不起作用(未发送正文)

Posted

技术标签:

【中文标题】CURL Post 不起作用(未发送正文)【英文标题】:CURL Post not working (Body is not being sent) 【发布时间】:2017-09-15 15:35:34 【问题描述】:

我有这种方法,我试图用POST 发送POST 请求正文:

public function executePost($url, $theBody, $headers)

    $data_string = '"apple": "fruit", "turnip": "vegetable"'; // hard coded for now                                                                               
    \Log::info($data_string);                                                                                               
    $ch = curl_init($url);                                                                      
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
    curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge($headers, array(                                                                          
        'Content-Type: application/json',                                                                                
        'Content-Length: ' . strlen($data_string))                                                                       
    ));                                                                                                                   

    $result = curl_exec($ch);

    \Log::info($result);

在接收端我没有得到我做的数据:

\Log::info(\Input::all());

我什么也没得到,即一个空数组。我似乎无法弄清楚这有什么问题。

它可以在另一台使用 WAMP 的计算机上运行,​​我使用的是 Ubuntu 16.04 和 php 5.6。

【问题讨论】:

能否告诉我们接收端代码? 尝试在接收端获取数据 $_POST = json_decode(file_get_contents("php://input"), true );和 print_r($_POST);它和 var_dump($result); 试过了,不行。 所以你首先要发送的$data_string请检查一下,这是不是一个有效的jsonjsonformatter.curiousconcept.com 【参考方案1】:

尽量让数据看起来像这样:

$post = [
   'username' => 'user1',
   'password' => 'passuser1',
   'gender'   => 1,
];

【讨论】:

【参考方案2】:

请尝试这样通过

$data_string = '"apple": "fruit", "turnip": "vegetable"';                                                                                             
$ch = curl_init('http://requestb.in/13zghda1');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, array('data' => $data_string));                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                                                           
$result = curl_exec($ch);

请查看https://requestb.in/13zghda1?inspect 上的回复 在后端,您现在将获得数据

【讨论】:

我需要使用 curl 请求发送 json 输入。并且 curl 帖子字段需要一个字符串而不是 php 数组。 你需要使用 json 的 header。首先将数组转换为json $data_string = json_encode($data); 之后,您可以设置json的设置` curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string ))); ` 我正在这样做,请查看整个方法。 你需要使用php输入法读取你后端的内容` $jsonStr = file_get_contents("php://input"); //读取HTTP正文。 $json = json_decode($jsonStr); ` 我使用了测试API Url & 它似乎收到了原始数据requestb.in/13zghda1?inspect 试过了..还是空了..问题出在发送端..接收器工作正常。【参考方案3】:

如果你想发布一个数组($data),试试这个:

$data = ['apple' => 'fruit', 'turnip' => 'vegetable'];
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

【讨论】:

@MubasharAbbas 为什么你严格需要发送 JSON 而不是在接收端创建 JSON?【参考方案4】:

结果在花了两天时间之后,在调用这个方法时,我作为第三个参数(标题)传递了一个令牌,它的末尾有一个 \n(错误地),并且由于对于该字符,请求正文被截断。

我不知道为什么,但删除 \n 修复了它。

所以以后如果有人遇到这种情况,你的

curl 请求正文未发送或被截断

然后

查看您的请求标头中不应该存在的特殊字符。

【讨论】:

以上是关于CURL Post 不起作用(未发送正文)的主要内容,如果未能解决你的问题,请参考以下文章

SMTP仅发送正文不起作用Python [重复]

使用 Python Win32 发送电子邮件。将图像添加到电子邮件正文不起作用

发布请求不起作用,声称正文数据不存在

通过 POST 发送 JSON 不起作用 - 目标 C

为啥我向主题发送 Firebase 通知的请求不起作用(HTTP POST)?

Bash:将变量插入到 curl 调用中不起作用[重复]