php实现Soap调用的两种方法

Posted by 甘家城 on 2017-03-20 Viewed times

php也可以通过soap(一种基于xml的协议)和webservice进行数据交互。

这里通过两种方法来讲解,一个是php的SoapClient对象,另一个是php的curl。

第一种:先要做一件事就是在php.ini中把soap扩展开了。

extension=php_soap.dll

然后进行php代码的编写,这里直接讲解带有header验证的soap。没有header验证的话就不需要加设置header那几行。先查看所需的xml,这里用soap12举个栗子,关注下面xml中header和body部分。

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <HeaderName xxx="url">
      <username>int</username>
      <password>string</password>
    </HeaderName>
  </soap12:Header>
  <soap12:Body>
    <FuncName xxx="url">
       <neededData>data</neededData>
    </FuncName>
  </soap12:Body>
</soap12:Envelope>
<?php
//wsdl地址
$url="wsdl地址";
//出现类似于SOAP-ERROR: Parsing WSDL: Couldn't load from的错误时加上下面这行
libxml_disable_entity_loader(false);
//调用SoapClient对象
$client=new SoapClient($url);
//查看里面的函数数组
print_r($client->__getFunctions());
//构造header
$header = new SoapHeader('上面xml里的url','HeaderName',array('username'=>xxx,'password'=>xxx),true);
//设置header
$client->__setSoapHeaders($header);
//调用FuncName并传入数据
$return = $client->FuncName(array('neededData'=>xxx));
print_r($return);

第二种:用php的curl获取数据,之后解析xml,具体来看代码吧

<?php
//用curl带着post包和header去获取数据
function getData($soap_request){
      //构造头信息,和第一种方法的header不一样,具体查看webservice说明。
      $header = array(
          "Content-type: application/soap+xml; charset=utf-8",
          "Host: xxx.xxx.xxx.xxx",
          "Content-length: ".strlen($soap_request),
        );
      $soap_do = curl_init();
      curl_setopt($soap_do, CURLOPT_URL, "wsdl地址");
      curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
      curl_setopt($soap_do, CURLOPT_POST,           true );
      curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $soap_request);
      curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $header);
      $data = curl_exec($soap_do);
      return $data;
}
//处理得到的xml数据
function handData($result,$parentNode,$childNode){
      $xml=simplexml_load_string($result);
      $result = $xml->children('http://www.w3.org/2003/05/soap-envelope')
        ->children('url')
        ->$parentNode
        ->$childNode;
      return $result;
}
//使用方法
//下面是上面xml的字符形式,将需要传入的数据直接写成标签到xml字符里
$soap_request = "<?xml version......";
$return = $this->getData($soap_request);
//后面两个参数为返回xml的body内的两个标签名
$result = $this->handData($return,FuncName,returnData);

总结:一般来说会选择上一种,也可以先根据自己的情况来选择一种理解。毕竟具体问题具体分析,这边不能做到全部问题都概括,所以有多个解法总比唯一解好!

 

 


版权声明:本文为原创文章,转载请注明出处和作者,不得用于商业用途,请遵守 CC BY-NC-SA 4.0协议。

支付宝打赏 微信打赏

赞赏一下