Как правильно отправлять и получать XML с помощью curl?

Я пытаюсь опубликовать XML и получить ответ с сервера, но не повезло.

Ниже приведены условия на стороне сервера:

  • Запросы к серверу должны быть отправлены как XML через HTTP 1.1.

К HTTP-запросу применяются следующие требования:

  • Тип запроса должен быть POST;
  • Должен присутствовать заголовок Content-Length , а общая длина запроса должна быть ниже 16 КБ;
  • Должен присутствовать заголовок Content-Type , содержащий значение типа медиатекста text/xml ;

Вот мой сценарий:

 $url = "http://somedomain.com"; $xml = '<?xml version="1.0" encoding="UTF-8"?> <Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title> <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>'; $header = "POST HTTP/1.1 \r\n"; $header .= "Content-type: text/xml \r\n"; $header .= "Content-length: ".strlen($xml)." \r\n"; $header .= "Connection: close \r\n\r\n"; $header .= $xml; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header); $data = curl_exec($ch); echo $data; if(curl_errno($ch)) print curl_error($ch); else curl_close($ch); 

Это дает мне:

  HTTP Error 400. The request URL is invalid. Bad Request - Invalid URL 

Помогает ли это?

 <?php $url = "http://stackoverflow.com"; $xml = '<?xml version="1.0" encoding="UTF-8"?><Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title> <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>'; $headers = array( "Content-type: text/xml", "Content-length: " . strlen($xml), "Connection: close", ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); echo $data; if(curl_errno($ch)) print curl_error($ch); else curl_close($ch); ?> 

Из документации .

CURLOPT_CUSTOMREQUEST

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

Параметр для CURLOPT_CUSTOMREQUEST должен быть просто POST и вы можете использовать CURLOPT_HTTPHEADER для установки заголовков.