首頁 >後端開發 >php教程 >php如何處理wsdl

php如何處理wsdl

藏色散人
藏色散人轉載
2019-12-03 14:24:293196瀏覽

0x00 前言

近期一直在寫接口,在此之前接口資料傳輸都是使用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結構的資料給你。

沒錯,就是一坨...

php如何處理wsdl

接下來,怎麼看懂它和它所說的方法才是關鍵,其它都是白搭。

0x02 理解描述文檔

剛開始看這個xml文檔時是比較懵逼的,但用PHP的擴展處理下就明顯很多了。

<?php
$client = new SoapClient(&#39;http://api.test.cn/xwebservices/testServer?wsdl&#39;);
print "\n提供的方法\n";
print_r($client->__getFunctions());
print "相关的数据结构\n";
print_r($client->__getTypes());
print "\n\n";

php如何處理wsdl

這裡我們用到了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 = &#39;http://api.test.cn/xwebservices/testServer?wsdl&#39;;
    private static $soapClientHandler;
    private $infoArr = [
        &#39;err_msg&#39; => &#39;false&#39;,
        &#39;err_code&#39; => &#39;0&#39;,
        &#39;date&#39; => &#39;此处是要传输的数据&#39;
    ];
    public function setUp()
    {
        $client = new SoapClient(&#39;http://api.test.cn/xwebservices/testServer?wsdl&#39;);
        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(
                &#39;in0&#39; => $ApiInfo[&#39;err_msg&#39;],
                &#39;in1&#39; => $ApiInfo[&#39;err_code&#39;],
                &#39;in2&#39; => $ApiInfo[&#39;date&#39;]
            );
            $result = $this->getSoapClientHandler()->synchUserInfo($parameter);
            //调用结果返回异常
            if (!$result instanceof stdClass) {
                throw new Exception("调用synchUserInfo结果出现异常:" . json_encode($result));
            }
            //调用接口状态码,输出对应错误详情
            if ($result->out == &#39;01&#39;) {
                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, &#39;SimpleXMLElement&#39;, 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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除