php如何处理wsdl

藏色散人
Lepaskan: 2023-04-07 21:42:02
ke hadapan
3234 orang telah melayarinya

0x00 前言

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

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

0x01 wsdl是什么

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

详见://m.sbmmt.com/faq/437443.html

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

没错,就是一坨...

28421c3fc7d991f4c4487b03993a819.png

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

0x02 理解描述文档

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

1

2

3

4

5

6

7

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

Salin selepas log masuk

05653125ef9f7976837243150044a23.png

这里我们用到了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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

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

    }

}

?>

Salin selepas log masuk

推进:《PHP教程

Atas ialah kandungan terperinci php如何处理wsdl. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan