如果使用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格式,使其满足规范。
调用成功!
如果你有更好的办法,欢迎讨论。