用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

php soap 调用webservice应用测试

时间:2015-01-23  来源:西部数据  作者:西部数据

SoapClient,php5自带的,当然,也可以使用nusoap.php这个纯php写的类,该类代码行数为7K多行,效率上肯定不如SoapClient.

一、寻找WebService来源

WebService可以自己编写,但是也可以从网络上去寻找现成的,我用的是www.xmethods.net里的US Zip Validator,它的WSDL文件位置在:http://www.webservicemart.com/uszip.asmx?WSDL,它的作用是根据输入的ZIP代码,返回该代码对应的美国地名,州名,经纬度等.

二、创建SoapClient

第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值,PHP代码如下:

  1. $objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL"); 
  2.  
  3. $param=array("ZipCode"=>$zip); 
  4. $out=$objSoapClient->ValidateZip($param); 
  5. $data=$out->ValidateZipResult; 

SoapClient的创建有好多方法,我们用的是最标准的(也是最简单的)WSDL方法,由于查询ZIP的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值.

也许读者会对这个数组的创建有一定的兴趣,比如,我们怎么知道“参数名”应该是“ZipCode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?OK,这个问题我们稍后解释,因为这牵涉到WSDL的解读.

创建好参数后,同样的,我们调用SoapClient的方法ValidateZip,并传递参数进去,对于返回的结果,我们用$data变量取出我们真正感兴趣的东西,同样的,这里也存在方法名称是如何确定的问题,我们也在稍后介绍.

如果你也使用PhpEd进行PHP的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系.

三、解析数据

上面得到的$data中的数据是标准的XML结构的数据,所以在PHP中,我们需要创建一个XML解析器来对这个数据进行分析,代码如下:

  1. $ParsedData=array(); 
  2.  
  3. function startElement($parser$name$attribs
  4.     global $ParsedData
  5.     echo "<<font color="#0000cc">$name</font>"
  6.     if (count($attribs)) { 
  7.         foreach ($attribs as $k => $v
  8.         { 
  9.             $ParsedData[$k]=$v
  10.  
  11.             echo " <font color="#009900">$k</font>="<font color="#990000">$v</font>""
  12.         } 
  13.     } 
  14.     echo ">"
  15.  
  16. function endElement($parser$name
  17.     echo "</<font color="#0000cc">$name</font>>"
  18.  
  19. $xml_parser= xml_parser_create(); 
  20. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); 
  21. xml_set_element_handler($xml_parser"startElement""endElement"); 
  22.  
  23. echo "<pre>"
  24. if (!xml_parse($xml_parser$data)) { 
  25.     die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), 
  26.          xml_get_current_line_number($xml_parser))); 
  27. echo "</pre>"
  28.  
  29. xml_parser_free($xml_parser); 

这里的详细操作需要参考PHP函数手册中关于XML函数的那一章,这里不再赘述,一旦数据被解析成功,我们就可以进行进一步的处理,例如下面的代码就遍历该数组,然后输出,代码如下:

  1. foreach ($ParsedData as $k=>$v
  2.     echo $k."=>".$v."<br />"

四、解读WSDL

上面我们留下了两个疑问:如何知道一个WebService提供的方法,以及它的参数?所有的答案都在WSDL描述中,对于本文使用的WSDL来说,我们从中截取一段来分析,由于我们是通过Soap进行调用,所以我对完整的WSDL进行了节选,只列出关于Soap调用的部分(反相显示的部分)

首先我们注意到<wsdl:message name=”ValidateZipSoapIn”>这一节,它指出了在Soap调用中,入口参数要参照ValidateZip,于是我们接着转到文件上面一点的地方,看ValidateZip方法的定义,代码如下:

  1. <s:element name="ValidateZip"> 
  2.     <s:complexType> 
  3.         <s:sequence> 
  4.             <s:element minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string"/> 
  5.         </s:sequence> 
  6.     </s:complexType> 
  7. </s:element> 

很明显,ValidateZip要求一个参数,名称为ZipCode,类型为string.

同样,我们再看<wsdl:message name=”ValidateZipSoapOut”>这一节,它指出Soap调用的出口参数是ValidateZipResponse,而后者的传出参数名称是ValidateZipResult。于是,我们就解释了前两节提出的问题:

•怎样找到要调用的函数?

•怎样知道函数的参数、类型?

•怎样得到函数的返回值?

例2,这里我们使用php5自带的类来操作

我的结构如下:在 webservice 文件夹下有如下三个文件:Personinfo.php,SoapClient.php,SoapServer.php,具体作用可以参照代码中的注释,代码如下:

  1. <?php 
  2. /** 
  3. * Personinfo.php 
  4. * 此类包含了需要调用的方法 
  5. * @author itbdw 
  6. * 
  7. */ 
  8. class Personinfo { 
  9.  
  10. /** 
  11. * 返回姓名 
  12. * @return unknown_type 
  13. */ 
  14. public function getName() { 
  15. return ‘IT不倒翁’; 
  16.  
  17. /** 
  18. * 返回特定格式的日期 
  19. * @return unknown_type 
  20. */ 
  21. public function getTime() { 
  22. return date(‘Y-m-d’); 
  23.  
  24.  
  25. <?php 
  26. /** 
  27. * SoapServer.php 
  28. * webservice 服务器端实例 
  29. */ 
  30. //包含提供服务的类 
  31. require_once ‘Personinfo.php’; 
  32.  
  33. //根据实际情况修改下行内容 
  34. $s = new SoapServer(null, array("location" => "http://zby/webservice/SoapServer.php""uri" => "SoapServer.php")); 
  35.  
  36. $s->setClass("PersonInfo"); 
  37.  
  38. $s->handle(); 
  39. [/php] 
  40. [php] 
  41. <?php 
  42. <?php 
  43. /** 
  44. * SoapClient.php 
  45. * webservice 客户端实例 
  46. */ 
  47.  
  48. header(‘Content-Type:text/html;charset=utf-8′); 
  49.  
  50. try { 
  51.  
  52. //根据实际情况修改下行内容 
  53. $soap = new SoapClient(null, array(‘location’=>’http://zby/webservice/SoapServer.php’, ‘uri’=>’SoapServer.php’)); 
  54.  
  55. echo $soap->getName(); 
  56. echo $soap->getTime(); 
  57.  
  58. } catch(SoapFault $e) { 
  59. echo $e->getMessage(); 
  60. } catch(Exception $e) { 
  61. echo $e->getMessage(); 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门