近期一直在写接口,在此以前接口数据传输都是使用json
或者xml
格式进行传输或获取的。但此次和第三方联调时,他们给予的是wsdl
格式。瞬间秒变SB...php
google到测试用code,测试调用第三方接口返回状态200
。觉得没啥事了能够就此结束了,跟近后才发现,无论怎么调用他们接口就是没有正确的数据回显。随后他们那边查看log后发现,压根传过去的参数他们没有接收到,懵逼了一下午到晚上才解决了这个问题。以为挺有意思的,因此记下来先。web
综合某度上所说,它就是一个xml
格式的文档,用于描述Web Server的定义,也就是说是一个Web Server方法及参数说明。json
当咱们请求http://api.test.cn/xwebservices/testServer?wsdl'
,相似这种结尾是?wsdl
的URL时,会一坨xml结构的数据给你。数组
没错,就是一坨...数据结构
接下来,怎么看懂它和它所说的方法才是关键,其它都是白搭。测试
刚开始看这个xml
文档时是比较懵逼的,但用PHP的扩展处理下就明显不少了。this
<?php $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "\n提供的方法\n"; print_r($client->__getFunctions()); print "相关的数据结构\n"; print_r($client->__getTypes()); print "\n\n";
这里咱们用到了SOAP
扩展,这个扩展是PHP官方文案中出示操做处理WebServer服务扩展,最终咱们也是经过它来实现参数传输。google
在上面的图片中能够理解出,这个接口提供了三个方法,分别是:编码
xxxxUserInfo
xxxxResumeNum
download**
相关的数据机构则是指方法中参数名称,及参数类型。好比xxxxUserInfo
方法,须要三个string类型的参数。分别对应in0
,in1
和in2
。
注
此处的传参数key
必然是in0
,也就是一个无需数组,用户自定义或双方约定好的任意参数名称。在开始写接口方法的时候,我是根据接口文案中给予的参数说明如:err_msg(表示错误信息)
,err_code(表示错误编码)
,date(传输的最终数据)
进行传输的。后改成有序数组,挨个填入对应参数,此时key
就是的0
到2
。可试过以后仍是没什么卵用,最终包着试一试的心态,尝试一下将int0
做为键名,对应的err_msg
内容做为值。ok~,完美解决。
Code:
<?php /** * @author 0x584A * 获取WSDL接口数据 */ class getwsdlTest extends PHPUnit_Framework_TestCase { public $apiurl = 'http://api.test.cn/xwebservices/testServer?wsdl'; private static $soapClientHandler; private $infoArr = [ 'err_msg' => 'false', 'err_code' => '0', 'date' => '此处是要传输的数据' ]; public function setUp() { $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "提供的方法\n"; print_r($client->__getFunctions()); print "相关的数据结构\n"; print_r($client->__getTypes()); print "\n\n"; } /** * xxxxUserInfo方法 */ public function testxxxxUserInfoData() { try { $ApiInfo = $this->infoArr; //set request param $parameter = array( 'in0' => $ApiInfo['err_msg'], 'in1' => $ApiInfo['err_code'], 'in2' => $ApiInfo['date'] ); $result = $this->getSoapClientHandler()->synchUserInfo($parameter); //调用结果返回异常 if (!$result instanceof stdClass) { throw new Exception("调用synchUserInfo结果出现异常:" . json_encode($result)); } //调用接口状态码,输出对应错误详情 if ($result->out == '01') { throw new Exception("调用synchUserInfo=>error:" . $result->out . ",msg:接口数据异常"); } $xml_parser = xml_parser_create(); if (!xml_parse($xml_parser, $result->out, true)) { xml_parser_free($xml_parser); throw new Exception("调用synchUserInfo返回的不是一个xml结构体"); } xml_parser_free($xml_parser); //XXE libxml_disable_entity_loader(true); $xml = simplexml_load_string($result->out, 'SimpleXMLElement', LIBXML_NOCDATA); // 输出参数 var_dump($xml->data); echo " 成功".PHP_EOL; } catch (SoapFault $soapFault) { throw new Exception($soapFault->getMessage() . $this->getSoapClientHandler()->__getLastResponse()); } } /** * @description getSoapClientHandler */ public function getSoapClientHandler() { if (!self::$soapClientHandler) { self::$soapClientHandler = new SoapClient($this->getSynchApi()); } return self::$soapClientHandler; } /** * @description getSynchApi */ public function getSynchApi() { return $this->apiurl; } } ?>