2017-02-14 12 views
1

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

ответ

0

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

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

+0

К сожалению, у меня нет контроля над тем, что сервер пропустил в ответ - мне просто нужно определить значение одного из атрибутов данных результата для реализации специального случая обработки ошибок. – bezetde