php處理wsdl

php處理wsdl

Date:2016-09-26 19:39:30 By:0x584A

0x00 前言

近期一直在寫接口,在此之前接口數(shù)據(jù)傳輸都是使用json或者xml格式進(jìn)行傳輸或獲取的。但這次和第三方聯(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ù)說明。

詳見:http://baike.baidu.com/link?url=R7x3FdekxbndR4SlzQLZE_2m1ebpt_SWt9IMjoHSErvLlbZ3-hwhR3ERrinXS1xZaDvkYFpxWnUchrk34_WkZq

當(dāng)我們請求http://api.test.cn/xwebservices/testServer?wsdl',類似這種結(jié)尾是?wsdl的URL時,會一坨xml結(jié)構(gòu)的數(shù)據(jù)給你。

沒錯,就是一坨...

11.png

接下來,怎么看懂它和它所說的方法才是關(guān)鍵,其它都是白搭。

0x02 理解描述文檔

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

<?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";
22.png

這里我們用到了SOAP擴(kuò)展,這個擴(kuò)展是PHP官方文案中出示操作處理WebServer服務(wù)擴(kuò)展,最終我們也是通過它來實現(xiàn)參數(shù)傳輸。

在上面的圖片中可以理解出,這個接口提供了三個方法,分別是:

  • xxxxUserInfo

  • xxxxResumeNum

  • download****

相關(guān)的數(shù)據(jù)機(jī)構(gòu)則是指方法中參數(shù)名稱,及參數(shù)類型。比如xxxxUserInfo方法,需要三個string類型的參數(shù)。分別對應(yīng)in0in1in2。

此處的傳參數(shù)key必然是in0,也就是一個無需數(shù)組,用戶自定義或雙方約定好的任意參數(shù)名稱。在開始寫接口方法的時候,我是根據(jù)接口文案中給予的參數(shù)說明如:err_msg(表示錯誤信息)err_code(表示錯誤編碼),date(傳輸?shù)淖罱K數(shù)據(jù))進(jìn)行傳輸?shù)?。后改為有序?shù)組,挨個填入對應(yīng)參數(shù),此時key就是的02??稍囘^之后還是沒什么卵用,最終包著試一試的心態(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;
    }

}
?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 4,021評論 1 66
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,444評論 6 13
  • 刪掉了之前寫的一堆廢話,我還是習(xí)慣簡單明快……盡管字?jǐn)?shù)不多,看起來不漂亮…… 新浪微博,定位其實是一個信息流媒體平...
    Mr丶Peng閱讀 5,714評論 0 4

友情鏈接更多精彩內(nèi)容