旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

php怎样处置惩罚wsdl【php教程】

作者:搜搜PHP网发布时间:2019-12-04分类:PHP教程浏览:84


导读:0x00媒介近期一直在写接口,在此之前接口数据传输都是运用json或许xml花样举行传输或猎取的。但这次和第三方联调时,他们赋予的是wsdl花样。霎时秒变SB...g...
0x00 媒介

近期一直在写接口,在此之前接口数据传输都是运用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网别的相干文章!

标签:phpwsdl