2011-10-20 137 views
2

我有以下代碼:411錯誤捲曲

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錯誤?

回答

1

http_build_query僅用於發送application/x-www-form-urlencoded數據,而您的數據不是。你的POST數據可能會搞砸了,所以你不會發送一個Content-Length頭與您的請求。假設你有你的參數作爲這些鍵值對的數組,你可以使用以下內容:

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); 
1

這應該做的伎倆:

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"score": 1337, "playerName": "Sean Plott", "cheatMode": false }'); 

只是通過JSON字符串直接。你的命令行版本沒有爲這個json數據指定一個字段名,所以PHP/curl版本也不應該。

+0

我可以做json_encode($ array)嗎?我試過了,它也沒有工作 – adit

+0

取決於你的陣列中有什麼。如果json編碼它會產生相同的json字符串,那麼肯定。 –

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

問題是否仍然存在?