Веб-сервис, который я вызываю, возвращает SoapFault со встроенным в XML <detail>
элемент — вот как это выглядит в SoapUI:
<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 / строку из detail
и разобрать это? Сообщение об ошибке определяется в WSDL, поэтому я предполагаю, что его структура должна быть известна на стороне клиента.
Атрибуты пространства имен не возвращаются в ответе php. Они используются только для определения типа объекта ответа.
Если вы хотите облегчить свой день, используйте генератор WSDL для php, такой как PackageGenerator проект. Это облегчит вам построение запроса, облегчит получение ответа и, наконец, облегчит обработку любой ошибки.
Других решений пока нет …