这两天用php调用.NET的WebService总是出现这样那样的问题,问题主要出在SoapHeader认证的环节上。因此这里总结下,避免下次出现同样的情况。
这里主要讨论下php调用WebService的情况,Server端就默认已经存在了。
首先看无SoapHeader认证的情况:
try
{
$client = new SoapClient( ' http://w15.abc.com/SmsWebService.asmx?wsdl ' );
$result = $client -> addSendSms( $paramArr );
$result = simplexml_load_string ( $result -> addSendSmsResult);
$state = $result -> smsstate;
} catch (SoapFault $fault ){}
echo $state ;
$client = new SoapClient( ' http://w15.abc.com/SmsWebService.asmx?wsdl ' );
$result = $client -> addSendSms( $paramArr );
$result = simplexml_load_string ( $result -> addSendSmsResult);
$state = $result -> smsstate;
} catch (SoapFault $fault ){}
echo $state ;
说明: 这里只要将$paramArr以数组的形式封装传递给addsendsms方法即可正常调用。
再看看有header验证的情况吧,这里就直接贴正常的代码了。里面有详细的说明
<?
php
header ( ' Content-Type: text/html; charset=utf-8 ' );
$s = new SoapClient( ' http://w1.abc.com/SmsWebService.asmx?wsdl ' );
/*
*SoapHeader参数说明如下所示:
*'http://tempuri.org/' namespace(命名空间可省略)
*'MySoapHeader' SoapHeader头的类名
*'array(...)' 存放标识身份的字符串参数
*'true' 是否必须处理该header
*/
$u = new SoapHeader( http://tempuri.org/ ' , ' MySoapHeader ' , array ( ' UserName ' => ' admin ' , ' PassWord ' => '123456 ' ) , true );
// 添加soapheader
$s -> __setSoapHeaders( $u );
// 调取需要的webservice方法
$suc = $s -> GetStockCode( array ( ' SendType ' => ' s05 ' ));
echo $suc -> GetStockCodeResult;
header ( ' Content-Type: text/html; charset=utf-8 ' );
$s = new SoapClient( ' http://w1.abc.com/SmsWebService.asmx?wsdl ' );
/*
*SoapHeader参数说明如下所示:
*'http://tempuri.org/' namespace(命名空间可省略)
*'MySoapHeader' SoapHeader头的类名
*'array(...)' 存放标识身份的字符串参数
*'true' 是否必须处理该header
*/
$u = new SoapHeader( http://tempuri.org/ ' , ' MySoapHeader ' , array ( ' UserName ' => ' admin ' , ' PassWord ' => '123456 ' ) , true );
// 添加soapheader
$s -> __setSoapHeaders( $u );
// 调取需要的webservice方法
$suc = $s -> GetStockCode( array ( ' SendType ' => ' s05 ' ));
echo $suc -> GetStockCodeResult;
其中标红的位置注意一下,参数对应理解清楚。取数据问题也就不大了。。。