2011-05-16 27 views
9

將提交後字符串提交給服​​務器時,我總是收到<h1>Length required</h1>錯誤。'使用cURL發佈數據時'需要的長度'

$cookie = "Secret cookie data here"; 

$searchData = array(
     '__EVENTTARGET' => 'ctl00$main$btn', 
     'ctl00$main$tbMNr' => $_GET['smth'], 
     'ctl00$main$tbMb' => $_GET['smthElse'], 
     '__VIEWSTATE' => 'smthElseHere' 
); 

// Commenting this out, as suggested by user lonesomeday 
//foreach ($searchData as &$elem) // This should not be necessary 
// $elem = urlencode($elem); 


// create a new cURL resource 

$fields = http_build_query($searchData); // Assuming it's an array 

if ($ch = curl_init("http://mysite.com")) 
{ 
     // set URL and other appropriate options 
     curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_POST, true); // Suggestion from Berry Langerak - no difference, same error 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

     $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
} 



$result = curl_exec($ch); 
if ($result === false) { 
    echo 'Curl error: ' . curl_error($ch); 
} 
echo "<pre>".$fields."</pre>".$result; // For debugging ONLY 

curl_close($ch); 

如果我註釋掉CURLOPT_POSTFIELDSCURLOPT_POST,一切都很好。

有什麼建議嗎?

編輯

當我加入這行

curl_setopt($ch, CURLOPT_HEADER, array('Content-Type:application/x-www-form-urlencoded')); 

我看到這個錯誤,正確的前Length Required

HTTP/1.1 411長度必需的Content-Type:text/html的日期:2011年5月16日星期一10:20:54 GMT連接:關閉內容長度:24

+0

有你嘗試過了「這不應該是必要的」取出來?因爲不,所以不需要。 – lonesomeday 2011-05-16 09:40:37

+0

是的,它不會使所有 – Ragnar123 2011-05-16 09:42:29

回答

5

您的用法完全混淆和困惑。

  1. 請不要自行更改Content-Length,而是讓libcurl執行它以使其正確。你打算做一個多部分formpost(傳遞一個哈希數組到POSTFIELDS選項)或一個「常規」(傳遞一個字符串POSTFIELDS選項)?接收器很可能會採用其中一種,而且您不能隨意隨意選擇一種類型。

  2. 當你有正確的POST,你知道你正確地發送數據(驗證對記錄的布勞爾使用),然後你可以看到服務器說,如果它仍然堅持什麼是錯的,那麼你回頭看在錄製的會話中調整您的請求以使其更類似於此。沖洗並重復,直到它工作。

+0

1.我不想改變內容長度 - 我指出它,希望它能幫助我解決問題。 我想用字符串使用常規字符串。現在,我已經使用'http_build_query實現了它($ searchData)' 好像我不能夠使用POST和Cookies的同時,捲曲,看到這個線程,我創建了後來,也許縮小問題下:HTTP: //stackoverflow.com/questions/6019294/loading-a-cookie-and-posting-data-with-curl。 – Ragnar123 2011-05-16 19:00:48

+0

噢,問題出在我加載cookie的時候。 – Ragnar123 2011-05-27 00:11:15

3

Ehrm,我沒有看到你告訴cURL你的意圖是做POST請求。添加以下選項:

curl_setopt($ch, CURLOPT_POST, true); 

這可能會解決問題。

+0

我想任何區別,它似乎並沒有工作。參數的順序是否有所不同? – Ragnar123 2011-05-16 09:45:21

+0

刪除內容長度行,看看有什麼區別?如果你提供*不正確*值,我可以想象服務器不喜歡你。 – 2011-05-16 10:48:33

1

編輯:你是否也嘗試刪除& amp; ?

http_build_query($array, '', '&'); 

=============

你嘗試註釋掉

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields))); 

,是你的Cookie數據是否有效?

儘量把一級代理:

$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
  • 建立一個引用:

    curl_setopt($ CH,CURLOPT_REFERER,$網址);

+0

你的所有領域都有效嗎?你是否僅僅通過一個簡單的請求來嘗試它? test = test&test2 = test2 – 2011-05-16 11:32:20

+0

是的,我試過簡單的請求。在我發送cookie之後,我不認爲服務器會收到任何請求。 – Ragnar123 2011-05-16 14:44:16

2

只想添加爲人民着想誰來到這裏,與相同的症狀:

如果要張貼到IIS 6,並沒有任何內容,你仍然需要發送的Content-Length :0或它會抱怨「需要的長度」。

0
$query ="email=".urlencode($usernames[$key]."@sktechno.net")."&firstName=".urlencode($usernames[$key])."&lastName=".urlencode($lastnames[$key]); 

$headerX = array(
'ISV_API_KEY: f6c1c52d03f49c9b4f94150256f2f0dcec6ada1d175d06e990e2d692f443a2db', 
'ISV_API_SECRET: 8ae599feda50db968cf4b536e7d79e4ad2d6bd60f41715336b73002819795cc0' 
); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerX); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);