- <?
- //初始化SoapClient客户端
- $client = new SoapClient("http://server:7000/Feature.asmx?wsdl");
- $param1="aaa";
- $param2="bbb";
- $param3="cccc";
- //这个WebService提供了一个方法,名为GetFeature其参数调用为三个字符串,所以这样写:
- $res=$client->GetFeature($param1,$param2,$param3);
- print_r($res);
- ?>
返回的是一个对象,stdClass,我又蒙了,这玩意怎么解析呢?
没办法,再google。遂明白,这是一个奇异的对象。。具体为什么奇异请自行搜索吧。我继续说我的流程。
PHP有个强大的serialize,无论什么都可以序列化成字符串。好,就用它来格式化一下这个对象。返回:
O:8:”stdClass”:1:{s:16:”GetFeatureResult”;O:8:”stdClass”:1:{s:7:”anyType”;s:6:”100001″;}}
嗯,这下有办法了,把$res->GetFeatureResult->anyType输出看看,果然是100001。
好了,俺这下会解析了返回结果了。剩下的工作是向合作方询问调用密码以生成校验码作为参数传过去,这个事儿就等周一上班再说吧。
周一上班了,打电话和合作方联系,费了一点力气,对应上了对方的校验规则。
好,开始调用看看。但是很快对方在MSN上发来反馈:
Event[10:51:17] 方法GetFeature:param1=param2=param3=[end]
呀,我的参数没有传过去。
再google,发现调用.net的服务器端时,客户端的SoapClient这样是传不过去参数的。
需要改成如下,使用__call(方法名,array(‘paramters’->参数数组))
直接调用->方法名(参数)的时候,__call会使用参数数组作为第二个参数,而.net需要把它再套一层数组,并使用‘paramters’作为键值
- <?
- //初始化SoapClient客户端
- $client = new SoapClient("http://server:7000/Feature.asmx?wsdl");
- $param["param1"]="aaa";
- $param["param2"]="bbb";
- $param["param3"]="cccc";
- //必须这样调用才能获得结果,至于为什么必须这么调用,我也不知道……
- $res=$client->__Call('GetFeature',array('paramters'=>$param));
- print_r($res->GetFeatureResult->anyType);
- ?>
终于获得了我需要的数据!java写的服务器端用第一种方法调用即可,而.net写的服务器端必须用第二种方法才能把参数正确地传过去。
注:linux下需要编译PHP的时候加上编译参数: –enable-soap。我的PHP版本是5.2.5
windows下只需要去掉extension=php_soap.dll这行前面的分号即可
一月 12th, 2009 at 12:13
Why do you send this link to me…
I need to update my extrasensory perception to decode it…
六月 17th, 2009 at 17:37
__Call 麻烦问下,我引用了这个,程序报错,请问有什么解决方式?
七月 15th, 2009 at 22:24
@Joewere
请确定如下两个要点
1.使PHP支持soap
2.确认对方提供的WebService是用java写的还是用.net写的。//我个人没有java或.net 经验,对WebService理解不深