php通过SoapClient调用webservice接口以及注意项

一、安装soap扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1、Linux下安装soap模块
查看soap模块是否安装的办法:在php的安装目录下运行php -m来查看
$phppath/bin/php -m | grep soap
如果没有安装,则进入php的安装源文件夹
cd php-$version/ext/soap
// 进入文件夹后执行
$phppath/bin/phpize
然后安装编译
make & make install
安装好之后会提示soap.so文件的保存路径
接着修改php.ini文件
;extension=soap.so
去掉前面的;
重启apache或者php-fpm
service httpd restart 或者 /etc/init.d/php-fpm restart

二、客户端调用示例代码

1、无SoapHeader认证的情况

1
2
3
4
5
6
7
8
try{
$client = new SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
$result = $client->toDo($paramArr);
$result = simplexml_load_string($result->toDoResult);
$state = $result->smsstate;
}catch (SoapFault $fault){}
echo $state;

2、有SoapHeader验证的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
/*
*SoapHeader参数说明如下所示:
*'http://tempuri.org/' namespace(命名空间可省略 根据服务端定)
*'MySoapHeader' SoapHeader头的类名
*'array(...)' 存放标识身份的字符串参数
*'true' 是否必须处理该header
*/
$head = new \SoapHeader(http://tempuri.org/', 'MySoapHeader', array('uname'=>'admin','pwd'=>'123456'), true);
//添加soapheader
$soap->__setSoapHeaders($head);
//调取需要的webservice方法
$res = $s->toDo(array('param'=>'val'));
echo $res->toDoResult;

三、参数值传输接收不到的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
第一次传递的参数,在服务端接收参数正常,修改参数名后,给参数赋值,在服务端出现接收不到参数值的现象
调试1:安装soapui,发起调用 -> 调用正常 判断:排除服务器端问题
调试2:将参数值修改为固定字符串值,再发起调用 -> 依然接收不到 判断:排除参数赋值失效
调试3:改变参数位置,再发起调用 -> 依然接收不到 判断:排除参数位置影响
调试4:删除runtime缓存文件,再发起调用 -> 依然接收不到 判断:排除程序缓存文件影响
调试5:重启apache或php-fpm,再发起调用 -> 依然接收不到 判断:排除web服务器环境问题
调试6:本地wamp环境,发起调用 -> 接收正常 判断:soap环境差异问题导致,查找到是soap缓存的问题
修改代码
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl', array('cache_wsdl' => 0));
发起调用 -> 接收正常

五、总结

1
2
参数名接收到,但参数值接收不到,这很怪异,一开始没有怀疑缓存原因,归根到底是对soap的基础理解得不够深刻。使用排除法定位问题的
速度还是比较局限。透过现象去了解程序的本质,设计思想,对于分析、解决问题有很大的帮助