Неверный запрос на PHP Curl запрос веб-службы SOAP - PullRequest
0 голосов
/ 04 марта 2019

Вот метод, который я использую:

$xml_data = 'XML data';

$headers = array(
"POST /ws_autos.asmx HTTP/1.1",
"Host: (web service url)",
"Content-Type: text/xml; charset=utf-8",
"SOAPAction: \"http://tempuri.org/(web service method)\"",
"Content-length: ".strlen($xml_data)
);

$url = (web service url)?wsdl;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

$reply = curl_exec($ch); 



$xmli = new SimpleXMLElement($reply);


print_r($reply);

print_r($xmli);

Я получаю ошибку плохого запроса без объяснения при исключении.Я проверил тело XML на наличие ошибок, но, похоже, их нет, и в заголовке нет ничего неуместного, насколько я знаю.

Я пытался использовать SoapClient, но не могу найти ни одногодокументация / ресурсы по созданию тела XML с указанием количества вложений.

1 Ответ

0 голосов
/ 04 марта 2019

ваш xml поврежден, СТРОГО говоря.

DOMDocument :: loadXML - очень строгий анализатор XML, и он говорит следующее: Warning: DOMDocument::loadXML(): XML declaration allowed only at the start of the document in Entity, line: 2 in /in/EOrYe on line 43

, потому что:the newline corrupts your XML

ваша декларация <?xml - это не первая вещь в вашем XML.самая первая вещь в вашем XML - это новая строка, ТОГДА приходит ваш <?xml.Вы можете либо удалить символ новой строки, либо заменить

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

на

curl_setopt($ch, CURLOPT_POSTFIELDS, trim($xml_data));

, а также избавиться от

"Content-length: ".strlen($xml_data)

, поскольку libcurl автоматически добавит его длявы, если вы этого не сделаете, и libcurl не сделает никаких ошибок по этому поводу (в отличие от вас, если вы сделаете curl_setopt($ch, CURLOPT_POSTFIELDS, trim($xml_data));, то длина изменится из-за обрезки, так что в значительной степени всегда пусть curl делаетэто для вас.)

также избавьтесь от "POST /ws_autos.asmx HTTP/1.1"

, потому что 1: curl добавит этот заголовок для вас.и 2: вы не знаете здесь, будет ли curl использовать HTTP / 1.0 или HTTP / 1.1 или HTTP / 2, если curl решит использовать здесь HTTP / 2, вы испортите запрос .. (и curl DOES support)HTTP / 2 сейчас, даже если для этого требуются библиотеки nginx, iirc и сборки curl на многих серверах еще не поддерживают его, но вы бы не хотели, чтобы ваш скрипт волшебным образом перестал работать, как только ваша сборка curl поддерживает HTTP / 2, не так ли?нет, вы бы этого не сделали.)

также избавьтесь от "Host: demo.caledoniaseguros.com.ar",

, потому что curl добавит его для вас, если URL-адрес правильный.ЕДИНСТВЕННЫЙ раз, когда вам нужно (и нужно) установить Host: -header вручную, это когда у вас проблемы с DNS, вы не можете доверять DNS или время поиска DNS настолько медленное, что вы не можете оценить производительностьудар, все эти сценарии чрезвычайно редки, и чаще всего это просто ошибка новичка.

...