>  기사  >  백엔드 개발  >  PHP는 wsdl을 처리합니다.

PHP는 wsdl을 처리합니다.

高洛峰
高洛峰원래의
2016-10-20 14:18:581588검색

0x00 서문

최근에 인터페이스를 작성해 왔습니다. 이전에는 json 또는 xml 형식을 사용하여 인터페이스 데이터 전송을 가져오거나 했습니다. 하지만 이번에는 제3자와 공동으로 디버깅할 때 wsdl 형식을 제공했습니다. 순식간에 SB로 변신...

Google에서 테스트 코드를 검색하면 테스트에서 타사 인터페이스를 호출하여 상태 200을 반환합니다. 아무 일도 일어나지 않으면 끝나는 줄 알았는데, 가까이 다가가보니 그들의 인터페이스를 아무리 호출해도 올바른 데이터가 반환되지 않는다는 것을 알게 되었습니다. 나중에 로그를 확인한 후 그들은 전달된 매개 변수를 전혀 받지 못했다는 사실을 발견했습니다. 그들은 문제를 해결하기 전까지 오후부터 저녁까지 혼란스러워했습니다. 꽤 흥미로울 것 같아 먼저 적어봤습니다.

0x01 wsdl이란 무엇인가요?

지금까지 말한 바에 따르면 Web Server의 정의를 기술하기 위해 사용되는 xml 형식의 문서, 즉 Web Server 방식입니다. 및 매개변수 설명.

참조: http://baike.baidu.com/link?url=R7x3FdekxbndR4SlzQLZE_2m1ebpt_SWt9IMjoHSErvLlbZ3-hwhR3ERrinXS1xZaDvkYFpxWnUchrk34_WkZq

http://api.testcn/x를 요청하는 경우. 웹 서비스/testServer?wsdl ' , 이렇게 URL이 ?wsdl로 끝나면 XML 구조의 데이터 묶음이 제공됩니다.

그렇습니다 그냥 덩어리입니다...

PHP는 wsdl을 처리합니다.

다음은 어떻게 이해하고 어떻게 말하는지가 관건이고 나머지는 다 안됨 .

0x02 설명 문서 이해하기

이 xml 문서를 처음 봤을 때 꽤 헷갈렸는데, PHP 확장을 사용하고 나니 훨씬 더 명확해졌습니다.

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

PHP는 wsdl을 처리합니다.

여기서 SOAP 확장을 사용합니다. 이 확장은 공식 PHP 카피에서 제공되는 작업 처리 WebServer 서비스 확장입니다. 매개변수 전송을 구현하십시오.

위 그림에서 알 수 있듯이 이 인터페이스는 세 가지 방법, 즉

xxxxUserInfo

xxxxResumeNum

다운로드**

관련 데이터 구조는 메소드의 매개변수 이름과 매개변수 유형을 나타냅니다. 예를 들어 xxxxUserInfo 메서드에는 세 가지 문자열 유형 매개 변수가 필요합니다. 각각 in0, in1 및 in2에 해당합니다.

참고

여기서 매개변수 키는 배열이 필요하지 않은 임의의 매개변수 이름인 in0이어야 하며, 사용자가 정의하거나 양 당사자가 합의한 것입니다. 인터페이스 메소드 작성을 시작하면서 err_msg(오류 정보 표시), err_code(오류 코딩 표시), 날짜(최종 데이터 전송) 등 인터페이스 사본에 제공된 매개변수 설명을 기반으로 전송을 수행했습니다. 그런 다음 정렬된 배열로 변경하고 해당 매개변수를 하나씩 입력합니다. 이때 키는 0~2입니다. 그러나 시도한 후에도 여전히 작동하지 않았습니다. 마지막으로 시도해 볼 마음으로 int0을 키 이름으로 사용하고 해당 err_msg 콘텐츠를 값으로 사용해 보았습니다. 좋아요~, 완벽한 솔루션입니다.

코드:

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

}
?>


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.