Я продолжаю получать <h1>Length required</h1>
при отправке строки сообщения на сервер.
$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_POSTFIELDS
и CURLOPT_POST
, все в порядке.
Какие-либо предложения?
редактировать
Когда я добавляю эту строку
curl_setopt($ch, CURLOPT_HEADER, array('Content-Type:application/x-www-form-urlencoded'));
Я вижу эту ошибку, прямо перед Length Required
HTTP / 1.1 411 Требуемая длина Content-Type: text / html Дата: Пн, 16 мая 2011 10:20:54 GMT Подключение: закрыть Content-Length: 24
Ваше использование полностью перепутано и запутано.
Не изменяйте Content-Length самостоятельно, но пусть libcurl сделает это, чтобы он стал правильным.
Вы намереваетесь сделать multipart formpost (передать хэш-массив в параметр POSTFIELDS) или «обычный» (передать строку в параметр POSTFIELDS)? Приемник, скорее всего, возьмет на себя одну из них, и вы не можете просто случайно выбрать тип по своему усмотрению.
Когда у вас есть правильный POST, и вы знаете, что правильно отправляете данные (проверяйте на использование записанного браузера), вы можете увидеть, что говорит сервер, и если он все еще настаивает, что что-то не так, тогда вы оглядываетесь на записанный сеанс и настраиваете попросите более схожести с этим. Промыть и повторить до тех пор, пока он не будет работать.
Эмм, я не вижу, чтобы вы говорили cURL, что вы намерены сделать запрос POST. Добавьте следующий параметр:
curl_setopt($ch, CURLOPT_POST, true);
Это может решить проблему.
Просто хотел добавить ради людей, которые пришли сюда с такими же симптомами:
Если вы отправляете POST на IIS 6 и у вас нет содержимого, вам все равно нужно отправить Content-Length: 0 или он будет жаловаться на «Length Required».
EDIT : Вы также попытались удалить & 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, $ url);
$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);