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协议。
赞赏一下