2009-08-04 94 views
63

我嘗試從先前的Post請求切換到Get請求。它假設它是一個Get,但最終會發佈一個帖子。如何從PHP切換POST到GET CURL

我試圖在PHP如下:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null); 
curl_setopt($curl_handle, CURLOPT_POST, FALSE); 
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE); 

我缺少什麼?

附加信息: 我已經建立了一個連接來執行POST請求。這成功完成,但後來當我嘗試重新使用連接並使用上面的setopts切換回GET時,它仍然以不完整的POST標頭在內部執行POST。問題是它認爲它做了一個GET,但最終放置了一個沒有content-length參數的POST頭,並且連接失敗,出現了411錯誤。

+3

請小心Get請求。谷歌與他們玩得很開心。 ;) – NotMe 2009-08-04 02:11:10

+8

@Chris - 一位朋友發現,當他建立一個通過GET請求管理用戶貢獻內容的網站時,這是一種艱難的方式。 Googlebot樂於遵循所有'刪除'鏈接,並帶來可預測的結果。 – 2009-08-04 18:59:34

回答

28

解決:問題就出在這裏:

我同時通過_CUSTOMREQUEST_POST設置POST_CUSTOMREQUEST堅持爲POST_POST切換到_HTTPGET。服務器假設從_CUSTOMREQUEST頭是正確的,帶回來一個411

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST'); 
86

確保在執行GET請求時將查詢字符串放在URL的末尾。從curl_setopt() docsCURLOPT_HTTPGET(強調)

 
$qry_str = "?x=10&y=20"; 
$ch = curl_init(); 

// Set query data here with the URL 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php' . $qry_str); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 
 
With a POST you pass the data via the CURLOPT_POSTFIELDS option instead 
of passing it in the CURLOPT__URL. 
------------------------------------------------------------------------- 

$qry_str = "x=10&y=20"; 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 

// Set request method to POST 
curl_setopt($ch, CURLOPT_POST, 1); 

// Set query data here with CURLOPT_POSTFIELDS 
curl_setopt($ch, CURLOPT_POSTFIELDS, $qry_str); 

$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 

注:

[設置CURLOPT_HTTPGET等於] TRUE復位 HTTP請求方法得到的。
由於GET是默認值,因此只有在請求方法已更改時才需要。

+0

這是一個非常邪惡的方式來設置51秒的超時! – 2017-05-18 12:02:36

39

調用curl_exec($ curl_handle)默認

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET'); 
2

捲曲請求之前添加這是GET,你不必設置任何選項來創建GET CURL請求。