2016-10-07 68 views
1

我試圖編寫一個腳本讓PHP通過CURLOPT_CUSTOMREQUEST, 'PUT'對我執行PUT請求,但我一直收到422錯誤(這意味着數據格式錯誤,無法處理) 。PHP CURL PUT使用CURLOPT_POSTFIELDS保持接收422錯誤使用

首先,我試着直接發送終端和郵遞員的PUT請求,兩者都正常工作。請求的主體是一個簡單的JSON格式:

{"status":"online"} 

現在,這裏是我試過的代碼:

$ch = curl_init($url); 
    curl_setopt_array($ch, array(  
    CURLOPT_HTTPHEADER => array('Authorization: "Panda is cute"' . "\r\n" . 'application/json; charset=utf-8' . "\r\n" . 'Content-Length: 19' . "\r\n"), 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_CUSTOMREQUEST => 'PUT', 
    CURLOPT_POST => false, 
    CURLOPT_POSTFIELDS => http_build_query(array ("status" => "online")) 
)); 
    $out = curl_exec($ch); 
    curl_close($ch); 
    echo $out; 

我曾嘗試上面的代碼的一些修改。

  1. 我想curl_setopt的一切,而不是把他們都在curl_setopt_array
  2. 我試着設置CURLOPT_POST爲true。
  3. 我試圖CURLOPT_POSTFIELDS => json_encode(array ("status" => "online"))
  4. 我試圖CURLOPT_POSTFIELDS => array ("status" => "online")
  5. 我試圖CURLOPT_POSTFIELDS => '{"status":"online"}'
  6. 我試圖CURLOPT_POSTFIELDS => 'http_build_query({"status":"online"})'
  7. 我試圖CURLOPT_POSTFIELDS => 'http_build_query("status":"online")'
  8. 我試圖json_encode與上述兩個。
  9. 我也嘗試了以上所有與curl_setopt
  10. 我還試圖用",而不是我最喜歡的',我到處都可以像我在那兒寫過'PUT'

現在,當我使用非定製PUT請求,並上傳它的工作文件,但這是發佈挑戰,因爲我的製作環境不允許我做fopen()

P.S.感謝下面的答案,我知道爲什麼沒有現在的工作:

CURLOPT_HTTPHEADER => array('Authorization: "Panda is cute"' . "\r\n" . 'application/json; charset=utf-8' . "\r\n" . 'Content-Length: 19' . "\r\n")

這條線將投入額外的"\r\n"在標題的末尾(但是沒有它PHP不接受我的原語法,並會發布錯誤消息,而不是渲染頭部),使我的身體"\r\n"{"status":"online"}的內容代替。從POSTMAN生成

+0

郵遞員功能生成的代碼,所以對於PHP可以生成代碼,看看你有什麼做錯了:) –

+0

@AlwaysSunny是請告訴我如何產生代碼與PHP,我試圖使用數據包捕獲,但它沒有工作。 –

+0

想看看'生成代碼'鏈接在右上角https://www.getpostman.com/docs/code_snippets –

回答

1

PUT要求PHP

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "http://www.stackoverflow.com/", //put your url here 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "PUT", 
    CURLOPT_POSTFIELDS => "{\"status\":\"online\"}", 
    CURLOPT_HTTPHEADER => array(
    "authorization: Panda is cute", 
    "cache-control: no-cache", 
    "content-type: application/json", 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 
+0

好的,謝謝,讓我試試這個代碼。 –

+0

是的,但請確保根據數據參數更改'url','authorization header'和'body'內容。:) –

+0

它確實工作。讓我一行一行比較這條線,直到我找出它爲什麼不起作用,然後我會讓每個人都知道。 –