PHP SoapClient 解决多个namespace的问题。

来源:互联网 发布:小米5标配版网络是几g 编辑:程序博客网 时间:2024/06/05 11:40

如果使用SoapClient调用远程wsdl的方法的时候,需要写传入参数,通常是一个array, 然后调用方法名称就可以了:

$client = new SoapClient($wsUrl, array('soap_version'=>SOAP_1_2,'cache_wsdl'=>WSDL_CACHE_NONE,'exception'=>true,'trace'=>1));

$client->__soapCall(method_name, $param_array);


如果需要添加namespace, SoapClient 可以在定义的时候增加一个 ‘uri’ 的选项,如下

$client = new SoapClient($wsUrl, array('soap_version'=>SOAP_1_2,‘uri' => 'http://abc/namespace', 'cache_wsdl'=>WSDL_CACHE_NONE,'exception'=>true,'trace'=>1));

但是如果是两个以上不同的namespace, 就不好添加了。确少namespace调用soap请求时候,会报安全错误:BIP3113E: Exception detected in message flow...


解决办法是继承SoapClient类,重载其__doRequest 方法,修改方法的传入参数$request, 添加缺失的namespace,然后调用就可以成功了。

附加例子:

class MySoapClient extends SoapClient{

        function __doRequest($request, $location, $action, $version, $one_way=0){

                $newRequest = $request;
                $newRequest = str_replace('xmlns:ns1="http://abc.com"', 'xmlns:ns1="http://abc.com" xmlns:web1="http://csdn.com"', $newRequest);
                $newRequest = str_replace('<Location>', '<web1:Location>', $newRequest);
                $newRequest = str_replace('</Location>', '</web1:Location>', $newRequest);

                return parent::__doRequest($newRequest, $location, $action, $version);
        }
}

在这个例子中添加了一个namespace web1, 记得一定要把相应的标签也添加此web1和:,修补请求xml格式,使其满足规范。

调用成功!

如果你有更好的办法,欢迎讨论。

0 0
原创粉丝点击