Нежелательные строки, прикрепленные в начале и конце ответа SOAP в PHP SoapClient
Я выполняю следующий php-код, пытаясь получить запрос от сервера API SOAP
try {
$soap = new SoapClient($wsdl, $options);
$data = $soap->GetXYZ($params);
}
catch(Exception $e) {
$Lastresponse = $soap->__getLastResponse();
}
Все, что я получил, это код ответа "похоже, у нас нет XML-документа".
Но когда я посмотрел на переменную $Lastresponse в блоке catch, я нашел ее, как показано ниже:
------=_Part_1134075_393252946.1482317378966 Content-Type: application/xop+xml; charset=utf-8; type="text/xml" <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> ......all valid data ... </SOAP-ENV:Body> </SOAP-ENV:Envelope> ------=_Part_1134075_393252946.1482317378966--
Примечание: параметры $options, которые я использую, следующие:
$options = array(
'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
//'style'=>SOAP_RPC,
//'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true
);
Хотя я сделал обходной путь для анализа xml, у кого-нибудь есть какие-либо идеи об этих дополнительных битах? Есть что-то я делаю не так?
3 answers
Эти -----Part
вещи называются границей в составных сообщениях, объясненных здесь и определенных в RFC2387.
После расследования кажется, что SoapClient не способен анализировать составные сообщения, поэтому вы получили это исключение.
Решение состоит в том, чтобы расширить SoapClient для извлечения содержимого XML с помощью регулярных выражений или других строковых функций. Вот пример из этой страницы:
class MySoapClient extends SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$response = parent::__doRequest($request, $location, $action, $version, $one_way);
$start = strpos($response,'<?xml');
$end = strrpos($response,'>');
return substr($response,$start,$end-$start+1);
}
}
Запрашиваю вас попробовать использовать следующий запрос
$headers = array(
"POST: ".url." HTTP/1.1",
"Host: ".domain."",
"Accept-Encoding: gzip,deflate",
"Content-type: text/xml;charset=UTF-8",
"SOAPAction: \"http://tempuri.org/wsdlurl/methodname\"",
"Connection: Keep-Alive",
"Content-length:".strlen($xml),
"User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
"
)
$url = your url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_POSTFIELDS, $options); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$err = curl_error($ch);
$doc = new DOMDocument();
$doc->loadXML( $response );
$authKey = $doc->getElementsByTagName( "fieldname" );
SoapClient::SoapClient() выдаст ошибку E_ERROR, если параметры местоположения и uri не указаны в режиме, отличном от WSDL.
Исключение SoapFault будет выдано, если URI wsdl не может быть загружен.