Webservice Я звоню возвращает SoapFault с XML, встроенный в <detail>
элемент - это то, как он выглядит в SoapUI:PHP не SoapFault передавая атрибуты подробно подэлементов
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>some error msg</faultstring>
<detail>
<e:exchange-error xmlns:e="http://mycompany.com/faults">
<e:message-data id="00001" type="005"/>
<e:result-data date="2017-02-13 15:44:33" code="1401" ref="2457798154426512"/>
</e:exchange-error>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>`
Похоже, что реализация PHP не пропускает атрибуты из XML-узлов, он просто возвращает значения (которые в данном случае являются пустыми):
try {
$resp = $this->_soap->__soapCall("myMethod", ['param-data' => $req->get()]);
var_dump($response);
} catch (\SoapFault $e) {
if (empty($e->detail->{'exchange-error'}->{'result-data'})) {
echo "it's empty :(\n";
var_dump($e->detail->{'exchange-error'});
}
}
$ php -f foobar.php
it's empty :(
object(stdClass)#7 (4) {
["message-data"]=>
string(0) ""
["result-data"]=>
string(0) ""
}
есть ли способ, чтобы получить exchange-error
объект со значениями атрибутов? Или, может быть, просто получите XML/string от detail
и проанализируйте его? Сообщение об ошибке определено в WSDL, поэтому я предполагаю, что его структура должна быть известна на стороне клиента.
К сожалению, у меня нет контроля над тем, что сервер пропустил в ответ - мне просто нужно определить значение одного из атрибутов данных результата для реализации специального случая обработки ошибок. – bezetde