soap — PHP SoapFault не передает атрибуты в подробности подэлементам

Веб-сервис, который я вызываю, возвращает 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, поэтому я предполагаю, что его структура должна быть известна на стороне клиента.

1

Решение

Атрибуты пространства имен не возвращаются в ответе php. Они используются только для определения типа объекта ответа.

Если вы хотите облегчить свой день, используйте генератор WSDL для php, такой как PackageGenerator проект. Это облегчит вам построение запроса, облегчит получение ответа и, наконец, облегчит обработку любой ошибки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]