近期一直在写接口,在此之前接口数据传输都是运用json或许xml花样举行传输或猎取的。但这次和第三方联调时,他们赋予的是wsdl花样。霎时秒变SB...
google到测试用code,测试挪用第三方接口返回状况200。认为没啥事了能够就此结束了,跟近后才发明,不管怎样挪用他们接口就是没有准确的数据回显。随后他们那里检察log后发明,压根传过去的参数他们没有接收到,懵逼了一下昼到晚上才处置惩罚了这个问题。以为挺有意义的,所以记下来先。
0x01 wsdl是什么
综合某度上所说,它就是一个xml花样的文档,用于形貌Web Server的定义,也就是说是一个Web Server要领及参数申明。
详见:https://www.ki4.cn/faq/437443.html
当我们要求http://api.test.cn/xwebservices/testServer?wsdl',相似这类末端是?wsdl的URL时,会一坨xml构造的数据给你。
没错,就是一坨...
接下来,怎样看懂它和它所说的要领才是症结,别的都是白费。
0x02 明白形貌文档
刚入手下手看这个xml文档时是比较懵逼的,但用PHP的扩大处置惩罚下就显著很多了。
<?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效劳扩大,终究我们也是经由过程它来完成参数传输。
在上面的图片中能够明白出,这个接口供应了三个要领,离别是:
● 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; } } ?>
推动:《PHP教程》
以上就是php怎样处置惩罚wsdl的细致内容,更多请关注ki4网别的相干文章!