使用PHP curl发生411错误

时间:2011-10-20 18:44:00

标签: php curl

我有以下代码:

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错误?

3 个答案:

答案 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);

问题是否仍然存在?