您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)wsdl在php中的應(yīng)用,以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
近期一直在寫接口,在此之前接口數(shù)據(jù)傳輸都是使用json或者xml格式進行傳輸或獲取的。但這次和第三方聯(lián)調(diào)時,他們給予的是wsdl格式。瞬間秒變SB...
google到測試用code,測試調(diào)用第三方接口返回狀態(tài)200。以為沒啥事了可以就此結(jié)束了,跟近后才發(fā)現(xiàn),不管怎么調(diào)用他們接口就是沒有正確的數(shù)據(jù)回顯。隨后他們那邊查看log后發(fā)現(xiàn),壓根傳過去的參數(shù)他們沒有接收到,懵逼了一下午到晚上才解決了這個問題。覺得挺有意思的,所以記下來先。
0x01 wsdl是什么
綜合某度上所說,它就是一個xml格式的文檔,用于描述Web Server的定義,也就是說是一個Web Server方法及參數(shù)說明。
詳見:https://www.php.cn/faq/437443.html
當(dāng)我們請求http://api.test.cn/xwebservices/testServer?wsdl',類似這種結(jié)尾是?wsdl的URL時,會一坨xml結(jié)構(gòu)的數(shù)據(jù)給你。
沒錯,就是一坨...
接下來,怎么看懂它和它所說的方法才是關(guān)鍵,其它都是白搭。
0x02 理解描述文檔
剛開始看這個xml文檔時是比較懵逼的,但用PHP的擴展處理下就明顯很多了。
<?php $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "\n提供的方法\n"; print_r($client->__getFunctions()); print "相關(guān)的數(shù)據(jù)結(jié)構(gòu)\n"; print_r($client->__getTypes()); print "\n\n";
這里我們用到了SOAP擴展,這個擴展是PHP官方文案中出示操作處理WebServer服務(wù)擴展,最終我們也是通過它來實現(xiàn)參數(shù)傳輸。
在上面的圖片中可以理解出,這個接口提供了三個方法,分別是:
● xxxxUserInfo
● xxxxResumeNum
● download**
相關(guān)的數(shù)據(jù)機構(gòu)則是指方法中參數(shù)名稱,及參數(shù)類型。比如xxxxUserInfo方法,需要三個string類型的參數(shù)。分別對應(yīng)in0,in1和in2。
注
此處的傳參數(shù)key必然是in0,也就是一個無需數(shù)組,用戶自定義或雙方約定好的任意參數(shù)名稱。在開始寫接口方法的時候,我是根據(jù)接口文案中給予的參數(shù)說明如:err_msg(表示錯誤信息),err_code(表示錯誤編碼),date(傳輸?shù)淖罱K數(shù)據(jù))進行傳輸?shù)?。后改為有序?shù)組,挨個填入對應(yīng)參數(shù),此時key就是的0到2??稍囘^之后還是沒什么卵用,最終包著試一試的心態(tài),嘗試一下將int0作為鍵名,對應(yīng)的err_msg內(nèi)容作為值。ok~,完美解決。
Code:
<?php /** * @author 0x584A * 獲取WSDL接口數(shù)據(jù) */ 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' => '此處是要傳輸?shù)臄?shù)據(jù)' ]; public function setUp() { $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "提供的方法\n"; print_r($client->__getFunctions()); print "相關(guān)的數(shù)據(jù)結(jié)構(gòu)\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); //調(diào)用結(jié)果返回異常 if (!$result instanceof stdClass) { throw new Exception("調(diào)用synchUserInfo結(jié)果出現(xiàn)異常:" . json_encode($result)); } //調(diào)用接口狀態(tài)碼,輸出對應(yīng)錯誤詳情 if ($result->out == '01') { throw new Exception("調(diào)用synchUserInfo=>error:" . $result->out . ",msg:接口數(shù)據(jù)異常"); } $xml_parser = xml_parser_create(); if (!xml_parse($xml_parser, $result->out, true)) { xml_parser_free($xml_parser); throw new Exception("調(diào)用synchUserInfo返回的不是一個xml結(jié)構(gòu)體"); } xml_parser_free($xml_parser); //XXE libxml_disable_entity_loader(true); $xml = simplexml_load_string($result->out, 'SimpleXMLElement', LIBXML_NOCDATA); // 輸出參數(shù) 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; } } ?>
關(guān)于wsdl在php中的應(yīng)用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。