2012-02-28 105 views
2

我嘗試使用php和curl發佈帖子請求。這裏是我的代碼php + curl無法設置發佈方法

//PHP 5.3.5 and curl: 7.18.2 
$ch = curl_init(); 
if(!empty($save_cookie)){ 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $save_cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $save_cookie); 
}else{ 
    curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
} 

curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/post.php'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars); 
curl_setopt($ch, CURLOPT_HEADER, $header); 
curl_setopt($ch, CURLOPT_NOBODY, !$body); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$postResult = curl_exec($ch); 

if (curl_errno($ch)) { 
    return false; 
} 

curl_close($ch); 
return $postResult; 

http://localhost/post.php,我寫

print_r($_SERVER); 

捲曲的結果回報總是

[REQUEST_METHOD] => GET 
+0

奇怪。你可以發佈數據包跟蹤嗎? (使用Wireshark或類似的。)另外,是通過CGI還是作爲模塊調用PHP?什麼網絡服務器?另見http://redmine.lighttpd.net/issues/1472。我懷疑如果你要設置POST數據並在post.php中查看'$ _POST',你會看到你的數據。 – Brad 2012-02-28 01:17:45

+0

我正在使用apache + fastcgi。我也打印$ _POST,但它'空 – complez 2012-02-28 01:23:29

回答

2

取出CURLOPT_NOBODY選項,它會工作。或者將它放在CURLOPT_POST的上方。

我想我已經遇到過這一次,當試圖得到一個響應的標題。設置

curl_setopt($ch, CURLOPT_NOBODY, true); 

有效指示curl發出HEAD請求,這是不是一個POST請求。我認爲沒有辦法只從POST獲得標題(並且在收到標題後就放棄連接)。作爲一個副作用,CURLOPT_NOBODYfalse臺請求類型設置爲GET ...

你真的需要標誌CURLOPT_NOBODY

+0

你節省了我的一天,它現在工作! – complez 2012-02-28 01:24:37

+0

但即使使用FALSE作爲「NOBODY」setopt的第三個參數,問題仍然存在。這是一個錯誤,因爲文檔明確指出請求類型不應該重置爲GET方式。 – raina77ow 2012-02-28 01:29:52

+0

@ raina77ow你應該提交一份錯誤報告! – mvds 2012-02-28 01:31:35

2

嘗試將

curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);

線前移動

curl_setopt($ch, CURLOPT_NOBODY, !$body);

行權。

這裏有一個有趣的帖子在curl/set_opt page,這種行爲脫落一些輕:

如果你的POST數據似乎消失(POST數據空,請求 正在由服務器處理的GET)請嘗試使用CURLOPT_NOBODY重新排列 CURLOPT_POSTFIELDS設置的順序。 CURLOPT_POSTFIELDS有 在CURLOPT_NOBODY設置後出現,因爲如果它出現在它之後 會清除標頭,該標頭會告訴您的URL目標 請求是POST而不是GET。

+0

Content-Type標頭不會告訴任何關於「POST」或「GET」的信息。 – mvds 2012-02-28 01:30:03

+0

是的,但爲什麼散佈錯誤的話? – mvds 2012-02-28 01:33:06