欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

用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这行前面的分号即可

written by 城市过客甲


3 Responses to “用PHP调用.net写的WebService服务端”

  1. 1. snowclothes Says: 

    Why do you send this link to me…
    I need to update my extrasensory perception to decode it…

  2. 2. Joewere Says: 

    __Call 麻烦问下,我引用了这个,程序报错,请问有什么解决方式?

  3. 3. 城市过客甲 Says: 

    @Joewere
    请确定如下两个要点
    1.使PHP支持soap
    2.确认对方提供的WebService是用java写的还是用.net写的。//我个人没有java或.net 经验,对WebService理解不深

普通分类: