PHP SoapFault没有在细节子元素中传递属性

时间:2017-02-14 14:34:22

标签: php soap soapfault

Webservice我的调用返回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对象?或者只是从detail获取XML /字符串并解析它?故障消息是在WSDL中定义的,所以我猜它的结构应该在客户端知道。

1 个答案:

答案 0 :(得分:0)

php响应中不返回命名空间属性。它们仅用于定义它的响应对象类型。

如果您想轻松一天,请使用WSDL到php生成器,例如PackageGenerator项目。它将使您轻松构建请求,它将使您轻松收到响应,最后它将使您轻松处理任何错误。