Получение неверного запроса с помощью CURL в PHP, отправляющем XML-данные

Я использую PHP CURL для отправки некоторых XML-данных на другой сервер с использованием этого IP-адреса, я выполнил все требования для его работы, но все еще получаю сообщение об ошибке «ПЛОХОЙ ЗАПРОС».

Взгляните на код ниже.

 $var2 ="<doc><item>Some content.</item></doc>";
    $url = "server IP";     
    $header  = "POST HTTP/1.1 \r\n";
    $header .= "Content-type: text/xml \r\n";
    $header .= "Content-length: ".strlen($var2)." \r\n";
    $header .= "Content-transfer-encoding: text \r\n";
    $header .= "Connection: close \r\n\r\n"; 
    $header .= $var2;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 4);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $var2);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);

    // Get Response
    $data = curl_exec($ch); 


    if(curl_errno($ch))

        print curl_error($ch);
    else
        curl_close($ch);

    echo  $data;

person jhoney1440    schedule 21.07.2011    source источник


Ответы (1)


Во-первых, вы используете это как строку запроса:

$header  = "POST HTTP/1.1 \r\n";

Согласно HTTP 1.1 RFC, **Request-Line** должен выглядеть следующим образом:

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

Итак, кажется, вы должны добавить URI между POST и HTTP/1.1
(Но прежде чем кодировать это, прочитайте то, что я написал в следующих абзацах моего ответа)


Затем вы передаете много вещей как CURLOPT_CUSTOMREQUEST.
Я не думаю, что вы можете передать все эти заголовки, используя эту опцию (цитирование):

Допустимыми значениями являются такие вещи, как «GET», «POST», «CONNECT» и т. д.;
т.е. Не вводите здесь всю строку HTTP-запроса.
Например, ввод "GET /index.html HTTP/1.0\r\n\r\n" будет неправильным.


Если вы хотите указать собственные заголовки (похоже, вы это делаете), вам следует использовать параметр CURLOPT_HTTPHEADER вместо CURLOPT_CUSTOMREQUEST (цитируя документацию по первому варианту) :

Массив полей заголовка HTTP для установки в формате array('Content-type: text/plain', 'Content-length: 100')

person Pascal MARTIN    schedule 21.07.2011