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协议。
赞赏一下
支付宝打赏
微信打赏