«Требуемая длина» при публикации данных с помощью cURL - PullRequest
9 голосов
/ 16 мая 2011

Я получаю ошибку <h1>Length required</h1> при отправке строки сообщения на сервер.

<code>$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."
". $ Result; // ТОЛЬКО для отладки 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 Необходимая длина Тип контента: text / html Дата: Пн, 16 мая 2011 10:20:54 GMT Соединение: закрыть Длина контента: 24

Ответы [ 5 ]

5 голосов
/ 16 мая 2011

Ваше использование полностью перепутано и запутано.

  1. Не изменяйте Content-Length самостоятельно, но позвольте libcurl сделать это так, чтобы оно стало правильным.

  2. Собираетесь ли вы сделать многокомпонентную формпост (передать хэш-массив в опцию POSTFIELDS) или «обычную» (передать строку в опцию POSTFIELDS)?Скорее всего, получатель примет один из них, и вы не сможете просто произвольно выбрать тип по своему желанию.

  3. Если у вас правильный POST и вы знаете, что отправляете данные правильно(сравните с записанным использованием браузера), , затем вы можете увидеть, что говорит сервер, и если он по-прежнему настаивает на том, что что-то не так, вы оглядываетесь на записанный сеанс и корректируете свой запрос, чтобы он был более похож на этот.Промыть и повторять, пока не получится.

4 голосов
/ 28 июля 2011

Просто хотел добавить ради людей, которые пришли сюда с такими же симптомами:

Если вы выполняете POSTing в IIS 6 и у вас нет контента, вам все равно нужно отправить Content-Length: 0или он будет жаловаться «Требуется длина».

3 голосов
/ 16 мая 2011

Эмм, я не вижу, что вы говорите cURL, что вы хотите сделать запрос POST.Добавьте следующую опцию:

curl_setopt($ch, CURLOPT_POST, true);

Это может решить проблему.

1 голос
/ 16 мая 2011

РЕДАКТИРОВАТЬ : Вы также пытались удалить & 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);

0 голосов
/ 08 ноября 2013
$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);
...