资讯专栏INFORMATION COLUMN

php处理wsdl

TwIStOy / 2170人阅读

摘要:前言近期一直在写接口,在此之前接口数据传输都是使用或者格式进行传输或获取的。理解描述文档刚开始看这个文档时是比较懵逼的,但用的扩展处理下就明显很多了。

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结构的数据给你。

没错,就是一坨...

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

0x02 理解描述文档

刚开始看这个xml文档时是比较懵逼的,但用PHP的扩展处理下就明显很多了。

__getFunctions());
print "相关的数据结构
";
print_r($client->__getTypes());
print "

";

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

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

xxxxUserInfo

xxxxResumeNum

download**

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

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

Code:

 "false",
        "err_code" => "0",
        "date" => "此处是要传输的数据"
    ];

    public function setUp()
    {
        $client = new SoapClient("http://api.test.cn/xwebservices/testServer?wsdl");
        print "提供的方法
";
        print_r($client->__getFunctions());
        print "相关的数据结构
";
        print_r($client->__getTypes());
        print "

";
    }

    /**
     * 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;
    }

}
?>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30486.html

相关文章

  • PHP SOAP 扩展的使用

    摘要:类也是一个只包含构造器的低级类,与和类相似。安装扩展对于平台,需要在中加入如下代码上面的工作完成之后,还需要注意的是扩展在配置文件中有独立的代码片段这些配置项主要是用来指定处理文件时使用缓存的行为。支持与扩展类似的。 原文地址:PHP SOAP 扩展,本文在原文基础上添加了一些内容和章节,也加入了一些注释,请读者注意。 前两篇文章 《SOAP 介绍》 和 《SOAP Web 服务介绍》...

    Cympros 评论0 收藏0
  • 学习 PHP SOAP 扩展的一些笔记

    摘要:对的相关学习就先告此一段落,这是最后一篇文章用来记录下学习过程中的一些笔记和心得。对,没错在还没有提供扩展前,的确很多人也是这样做的。总结上面都是自己在学习扩展时的一些零散的笔记,如果有不对的地方,希望大家指出,谢谢。 对 SOAP 的相关学习就先告此一段落,这是最后一篇文章用来记录下学习过程中的一些笔记和心得。 前面三篇文章分别是: 《SOAP 介绍》 《SOAP Web 服务介绍...

    wthee 评论0 收藏0
  • php实现webservice(实测C#及java可调用)

    摘要:具体如何操作这里跳过,实现是需要扩展的。返回值也很特别,不是直接返回,而是把它放到一个对象里再返回。返回值中值对应的是中的名称。最后按运行可以查看到对应的输出,如下图所示,说明实现的在中可以正确调用。 使用PHP搭建起一个其他语言如C#、JAVA可用的Webservice的方法与网上大多数所述的用PHP建立的webservice感觉是有差别的。对于接口的输入参数及输出参数较为复杂的情况...

    arashicage 评论0 收藏0
  • spring boot开发soap webservice

    摘要:本文介绍如何在中开发接口,以及接口如何同时支持和两种协议。该功能很简单,就是通过一个人的姓名查询这个人的详细信息。就是关键,如本次请求报文如下就是,对应。测试使用进行测试,通过地址导入文件进行测试。测试这样就实现了和同时提供的目的。 介绍spring boot web模块提供了RestController实现restful,第一次看到这个名字的时候以为还有SoapController,...

    Ashin 评论0 收藏0
  • laravel中soapServer支持wsdl的例子

    摘要:上边这段代码是无模式下的,但是这次是对接第三方的服务,需要我们这边去定义,第三方来调用,第三方定义的是模式的,所以今天研究了下。 $server = new SoapServer(null, [uri => noganluonguri]); $server->setObject(new NganluongServer()); ob_start(); $server->handle();...

    elarity 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<