近期一直在寫介面,在此之前介面資料傳輸都是使用json或者xml格式進行傳輸或獲取的。但這次和第三方聯調時,他們給予的是wsdl格式。瞬間秒變SB...
google到測試用code,測試呼叫第三方介面返回狀態200。以為沒啥事了可以就此結束了,跟近後才發現,不管怎麼呼叫他們介面就是沒有正確的資料回顯。隨後他們那邊檢視log後發現,壓根傳過去的引數他們沒有接收到,懵逼了一下午到晚上才解決了這個問題。覺得挺有意思的,所以記下來先。
0x01 wsdl是什麼
綜合某度上所說,它就是一個xml格式的文件,用於描述Web Server的定義,也就是說是一個Web Server方法及引數說明。
詳見:https://www.php.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 "nn";
這裡我們用到了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 "nn"; } /** * 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的詳細內容,更多請關注TW511.COM其它相關文章!