我一直坚持这个问题一段时间了。我正在尝试使用REST API来更改用户的某些设置,例如清除用户并将其设备设置为非活动状态。
REST调用是在php中完成的,我很陌生。大多数调用(获取和发布)工作正常,所以我认为我理解php和curl的基本概念,但我不能让put请求工作。问题是,在进行REST调用时,我得到状态代码200作为回报,表明一切正常,但是当我检查数据库时没有任何改变,设备仍处于活动状态。
我花了几个小时在stackexchange(cURL PUT Request Not Working with PHP,Php Curl return 200 but not posting,PHP CURL PUT function not working)上研究这个问题,并另外阅读各种教程。对我来说,我的代码看起来很好,并且与我在网上找到的很多例子类似。所以请帮我找到我的错误。
$sn = "123456789";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn);
$data = array("cmd" => "clearUser");
$headers = array(
'Accept: application/json',
'Content-Type: application/json'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$username = 'XXX';
$password = 'XXX';
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));
$output = curl_exec($ch);
curl_close($ch);
您可以在Header'Content-Type:application / json'中定义。尝试将$ data编码为json,然后传输jsonEncodeteData:
$dataJson = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);
也许这有帮助了。
在PUT请求的情况下,状态200可能不成功。在正确的语义(服务器的正确实现)中,成功的PUT返回“201 Created”,并且如果客户端发送空的或某种错误的内容,则服务器返回“204 No Content”。
懒惰的程序员可能只返回“200 Ok”而不是204,意思是“你的请求很好,但与数据无关”。
尝试验证您的数据,并确保发送的内容不是空的,并且符合API规范。
据我所知,您的代码中存在两个问题。
Content-Type: application/json
不正确,我会完全删除它。Content-Length
标题。我建议尝试
$sn = "123456789";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn);
$data = array("cmd" => "clearUser");
$httpQuery = http_build_query($data);
$headers = array(
'Accept: application/json',
'Content-Length: ' . strlen($httpQuery)
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$username = 'XXX';
$password = 'XXX';
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS,$httpQuery);
$output = curl_exec($ch);
curl_close($ch);