PHP curl只发送一次POST数据

时间:2016-03-25 17:11:04

标签: php post curl

我有以下PHP代码:

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,            "https://10.0.0.99/api/login");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,           1);
curl_setopt($ch, CURLOPT_POSTFIELDS,     "somethingsomething");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: text/plain',
    'Content-Length: 18')
);

$cookie = curl_exec($ch);

curl_setopt($ch, CURLOPT_URL,            "https://10.0.0.99/api/getcmds");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIE, "cookie=".$cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,           1);
curl_setopt($ch, CURLOPT_POSTFIELDS,     "");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: text/plain',
    'Content-Length: 0')
);

$response = curl_exec($ch);
$json = json_decode($response, true);

curl_setopt($ch, CURLOPT_URL,            "https://10.0.0.99/api/cmd/" . $json["value"]);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIE, "cookie=".$cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,           1);
curl_setopt($ch, CURLOPT_POSTFIELDS,     "on");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: text/plain',
    'Content-Length: 2')
);

curl_exec($ch);

curl_close($ch);

第一次调用curl_exec按预期发布字符串并返回响应。第二次通话也按预期工作。

然而,第三个调用不会将字符串“on”发布到服务器上。它正确获取返回的数据(没有“on”是错误的),但服务器永远不会收到发布的数据。

代码本身在命令行中使用-f标志在PHP 5.5.30上运行。 Curl Verbose模式显示Content-Length正在设置正确,但它没有显示有关已发布数据的任何信息。其余的帖子似乎是正确的,只是没有数据到达。

(PS:这不应该是生产代码,只是我正在玩的东西,所以请不要对代码质量/安全性发表评论。)

2 个答案:

答案 0 :(得分:0)

您可以尝试关闭连接,然后重新开始新的通话/请求。我亲自做这件事。

答案 1 :(得分:0)

来自cURL上的php.net文档: PHP: curl_setop

至于CURL_POSTFIELDS: 此参数可以作为urlencoded字符串传递,例如&#39; para1 = val1&amp; para2 = val2&amp; ...&#39;或者作为一个数组,字段名称为键,字段数据为值。

在您的情况下,您设置一个空变量$_POST['on']。如果您希望它具有某些特定值:

curl_setopt($ch, CURLOPT_POST,           1);
curl_setopt($ch, CURLOPT_POSTFIELDS,     "on=value");