我有以下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:这不应该是生产代码,只是我正在玩的东西,所以请不要对代码质量/安全性发表评论。)
答案 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");