我有以下代码:
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $this->credentials);
if ($action == 'post') {
curl_setopt($ch, CURLOPT_HTTPHEADER, array ("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
if(isset($params)){
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
}
}
我基本上试图模仿以下内容:
curl --user $APPLICATION_ID:$MASTER_KEY \
-X POST \
-H "Content-Type: application/json" \
-d '{"score": 1337, "playerName": "Sean Plott", "cheatMode": false }' \
https://api.somewebsite.com/1/classes/GameScore
截至目前,$ params是一个数组,不确定这是否正确..我应该json_encode $ params吗?如何摆脱411错误?
答案 0 :(得分:1)
这应该可以解决问题:
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"score": 1337, "playerName": "Sean Plott", "cheatMode": false }');
直接传递json字符串。您的命令行版本没有为此json数据指定字段名,因此PHP / curl版本也不应该。
答案 1 :(得分:1)
http_build_query
仅用于发送您的application/x-www-form-urlencoded
数据。您的POST数据可能已搞砸,因此您没有在请求中发送Content-Length
标头。假设您将params作为这些键值对的数组,您可以使用以下内容:
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
答案 2 :(得分:0)
411 Length Required表示客户端(即您)未能指定Content-Length
标头。
由于curl会自动添加,但如果您未能提供发布数据,则会将其设置为-1
,$param
可能未设置或http_build_query
未返回您的预期。如果你只是尝试
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $this->credentials);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
$json = '{"score": 1337, "playerName": "Sean Plott", "cheatMode": false}';
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
问题是否仍然存在?