php处理wsdl

   2016-10-01 0
核心提示:Date:2016-09-26 19:39:30 By:0x584A0x00 前言 近期一直在写接口,在此之前接口数据传输都是使用 json 或者 xml 格式进行传输或获取的。但这次和第三方联调时,他们给予的是 wsdl 格式。瞬间秒变SB...google到测试用code,测试调用第三方接口返回状态 200 。

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

0x00 前言

近期一直在写接口,在此之前接口数据传输都是使用 json 或者 xml 格式进行传输或获取的。但这次和第三方联调时,他们给予的是 wsdl 格式。瞬间秒变SB...

google到测试用code,测试调用第三方接口返回状态 200 。以为没啥事了可以就此结束了,跟近后才发现,不管怎么调用他们接口就是没有正确的数据回显。随后他们那边查看log后发现,压根传过去的参数他们没有接收到,懵逼了一下午到晚上才解决了这个问题。觉得挺有意思的,所以记下来先。

0x01 wsdl是什么

综合某度上所说,它就是一个 xml 格式的文档,用于描述Web Server的定义,也就是说是一个Web Server方法及参数说明。

详见: http://baike.baidu.com/link?url=R7x3FdekxbndR4SlzQLZE_2m1ebpt_SWt9IMjoHSErvLlbZ3-hwhR3ERrinXS1xZaDvkYFpxWnUchrk34_WkZq

当我们请求 http://api.test.cn/xwebservices/testServer?wsdl' ,类似这种结尾是 ?wsdl 的URL时,会一坨xml结构的数据给你。

没错,就是一坨...

php处理wsdl

接下来,怎么看懂它和它所说的方法才是关键,其它都是白搭。

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";

php处理wsdl

这里我们用到了 SOAP 扩展,这个扩展是PHP官方文案中出示操作处理WebServer服务扩展,最终我们也是通过它来实现参数传输。

在上面的图片中可以理解出,这个接口提供了三个方法,分别是:

  • xxxxUserInfo

  • xxxxResumeNum

  • download * *

相关的数据机构则是指方法中参数名称,及参数类型。比如 xxxxUserInfo 方法,需要三个string类型的参数。分别对应 in0in1in2

此处的传参数 key 必然是 in0 ,也就是一个无需数组,用户自定义或双方约定好的任意参数名称。在开始写接口方法的时候,我是根据接口文案中给予的参数说明如: err_msg(表示错误信息)err_code(表示错误编码)date(传输的最终数据) 进行传输的。后改为有序数组,挨个填入对应参数,此时 key 就是的 02 。可试过之后还是没什么卵用,最终包着试一试的心态,尝试一下将 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;
    }

}
?>
 
标签: WSDL PHP
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

点击排行