php soap namespace,PHP SoapClient 解决多个namespace的问题。

如果使用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('', '', $newRequest);

$newRequest = str_replace('', '', $newRequest);

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

}

}

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

调用成功!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值