php调用.net的WebService传参问题

从合作方获取数据,往往都是合作方提供xml格式的数据,或者rsync,甚至 直接SQLServer数据库,对应地,我写php解析xml,直接读取rsync推送过来的文件,用freetds连接SQLServer像读 mysql一样去读取数据。周五编辑把合作方的接口文档发信给我,我一看,地址形如http://server:7000 /Feature.asmx?wsdl,给了个方法,我立刻一头雾水,这是一个对我来说是完全陌生的领域,马上google,得知原来是著名的 webservice (wsdl),随后又google一下PHP如何调用,得知应使用Soap,new一个SoapClient就可以使用了。

  1. <?
  2. //初始化SoapClient客户端
  3. $client = new SoapClient("http://server:7000/Feature.asmx?wsdl");
  4.  
  5. $param1="aaa";
  6. $param2="bbb";
  7. $param3="cccc";
  8. //这个WebService提供了一个方法,名为GetFeature其参数调用为三个字符串,所以这样写:
  9. $res=$client->GetFeature($param1,$param2,$param3);
  10. print_r($res);
  11. ?>

返回的是一个对象,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’作为键值

  1. <?
  2. //初始化SoapClient客户端
  3. $client = new SoapClient("http://server:7000/Feature.asmx?wsdl");
  4.  
  5. $param["param1"]="aaa";
  6. $param["param2"]="bbb";
  7. $param["param3"]="cccc";
  8. //必须这样调用才能获得结果,至于为什么必须这么调用,我也不知道……
  9. $res=$client->__Call('GetFeature',array('paramters'=>$param));
  10. print_r($res->GetFeatureResult->anyType);
  11. ?>

终于获得了我需要的数据!java写的服务器端用第一种方法调用即可,而.net写的服务器端必须用第二种方法才能把参数正确地传过去。
注:linux下需要编译PHP的时候加上编译参数: –enable-soap。我的PHP版本是5.2.5
windows下只需要去掉extension=php_soap.dll这行前面的分号即可

转自:http://hi.baidu.com/psc2006hedan/blog/item/493fdf1bc552c9dcad6e75b5.html

Tags: webservice

上一篇: nginx rewrite规则不等于某文件怎么写   下一篇: FCKEditor早更名为CKEditor

提交疑问

回顶部