加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php soap 调用webservice应用测试

发布时间:2022-02-09 14:16:21 所属栏目:PHP教程 来源:互联网
导读:SoapClient,php5自带的,当然,也可以使用nusoap.php这个纯php写的类,该类代码行数为7K多行,效率上肯定不如SoapClient. 一、寻找WebService来源 WebService可以自己编写,但是也可以从网络上去寻找现成的,我用的是www.xmethods.net里的US Zip Validator,它的W
  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代码如下:
 
  $objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL");
  
  $param=array("ZipCode"=>$zip);
  $out=$objSoapClient->ValidateZip($param);
  $data=$out->ValidateZipResult;
  SoapClient的创建有好多方法,我们用的是最标准的(也是最简单的)WSDL方法,由于查询ZIP的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值.
 
  也许读者会对这个数组的创建有一定的兴趣,比如,我们怎么知道“参数名”应该是“ZipCode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?OK,这个问题我们稍后解释,因为这牵涉到WSDL的解读.
 
  创建好参数后,同样的,我们调用SoapClient的方法ValidateZip,并传递参数进去,对于返回的结果,我们用$data变量取出我们真正感兴趣的东西,同样的,这里也存在方法名称是如何确定的问题,我们也在稍后介绍.
 
  如果你也使用PhpEd进行PHP的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系.
 
  三、解析数据
 
  上面得到的$data中的数据是标准的XML结构的数据,所以在PHP中,我们需要创建一个XML解析器来对这个数据进行分析,代码如下:
 
  $ParsedData=array();
  
  function startElement($parser, $name, $attribs)
  {
      global $ParsedData;
      echo "<<font color="#0000cc">$name</font>";
      if (count($attribs)) {
          foreach ($attribs as $k => $v)
          {
              $ParsedData[$k]=$v;
  
              echo " <font color="#009900">$k</font>="<font color="#990000">$v</font>"";
          }
      }
      echo ">";
  }
  
  function endElement($parser, $name)
  {
      echo "</<font color="#0000cc">$name</font>>";
  }
  
  $xml_parser= xml_parser_create();
  xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
  xml_set_element_handler($xml_parser, "startElement", "endElement");
  
  echo "<pre>";
  if (!xml_parse($xml_parser, $data)) {
      die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)),
           xml_get_current_line_number($xml_parser)));
  }
  echo "</pre>";
  
  xml_parser_free($xml_parser);
  这里的详细操作需要参考PHP函数手册中关于XML函数的那一章,这里不再赘述,一旦数据被解析成功,我们就可以进行进一步的处理,例如下面的代码就遍历该数组,然后输出,代码如下:
 
  foreach ($ParsedData as $k=>$v)
  {
      echo $k."=>".$v."<br />";
  }
  四、解读WSDL
 
  上面我们留下了两个疑问:如何知道一个WebService提供的方法,以及它的参数?所有的答案都在WSDL描述中,对于本文使用的WSDL来说,我们从中截取一段来分析,由于我们是通过Soap进行调用,所以我对完整的WSDL进行了节选,只列出关于Soap调用的部分(反相显示的部分)
 
  首先我们注意到<wsdl:message name=”ValidateZipSoapIn”>这一节,它指出了在Soap调用中,入口参数要参照ValidateZip,于是我们接着转到文件上面一点的地方,看ValidateZip方法的定义,代码如下:
 
  <s:element name="ValidateZip">
      <s:complexType>
          <s:sequence>
              <s:element minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string"/>
          </s:sequence>
      </s:complexType>
  </s:element>
  很明显,ValidateZip要求一个参数,名称为ZipCode,类型为string.
 
  同样,我们再看<wsdl:message name=”ValidateZipSoapOut”>这一节,它指出Soap调用的出口参数是ValidateZipResponse,而后者的传出参数名称是ValidateZipResult。于是,我们就解释了前两节提出的问题:
 
  •怎样找到要调用的函数?
 
  •怎样知道函数的参数、类型?
 
  •怎样得到函数的返回值?
 
  例2,这里我们使用php5自带的类来操作
 
  我的结构如下:在 webservice 文件夹下有如下三个文件:Personinfo.php,SoapClient.php,SoapServer.php,具体作用可以参照代码中的注释,代码如下:
 
  <?php
  /**
  * Personinfo.php
  * 此类包含了需要调用的方法
  * @author itbdw
  *
  */
  class Personinfo {
  
  /**
  * 返回姓名
  * @return unknown_type
  */
  public function getName() {
  return ‘IT不倒翁’;
  }
  
  /**
  * 返回特定格式的日期
  * @return unknown_type
  */
  public function getTime() {
  return date(‘Y-m-d’);
  }
  
  }
  
  <?php
  /**
  * SoapServer.php
  * webservice 服务器端实例
  */
  //包含提供服务的类
  require_once ‘Personinfo.php’;
  
  //根据实际情况修改下行内容
  $s = new SoapServer(null, array("location" => "http://zby/webservice/SoapServer.php", "uri" => "SoapServer.php"));
  
  $s->setClass("PersonInfo");
  
  $s->handle();
  [/php]
  [php]
  <?php
  <?php
  /**
  * SoapClient.php
  * webservice 客户端实例
  */
  
  header(‘Content-Type:text/html;charset=utf-8′);
  
  try {
  
  //根据实际情况修改下行内容
  $soap = new SoapClient(null, array(‘location’=>’http://zby/webservice/SoapServer.php’, ‘uri’=>’SoapServer.php’));
  
  echo $soap->getName();
  echo $soap->getTime();
  
  } catch(SoapFault $e) {
  echo $e->getMessage();
  } catch(Exception $e) {
  echo $e->getMessage();
  } 

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读