Heim >Backend-Entwicklung >PHP-Tutorial >PHP verwaltet WSDL

PHP verwaltet WSDL

高洛峰
高洛峰Original
2016-10-20 14:18:581659Durchsuche

0x00 Vorwort

Ich habe in letzter Zeit Schnittstellen geschrieben, die über das JSON- oder XML-Format übertragen oder abgerufen wurden. Aber dieses Mal stellten sie beim gemeinsamen Debuggen mit einem Dritten das WSDL-Format bereit. Im Handumdrehen in SB umgewandelt...

Googeln Sie den Testcode und der Test ruft die Drittanbieterschnittstelle auf, um den Status 200 zurückzugeben. Ich dachte, es wäre vorbei, wenn nichts passierte, aber als ich näher kam, stellte ich fest, dass egal wie ich ihre Schnittstelle aufrief, nicht die richtigen Daten zurückgegeben wurden. Später, nachdem sie das Protokoll überprüft hatten, stellten sie fest, dass sie die übergebenen Parameter überhaupt nicht erhalten hatten. Sie waren einen Nachmittag lang und bis in den Abend hinein verwirrt, bevor sie das Problem lösten. Ich fand es ziemlich interessant, also habe ich es zuerst aufgeschrieben.

0x01 Was ist WSDL?

Basierend auf dem, was gesagt wurde, handelt es sich um ein Dokument im XML-Format, das zur Beschreibung der Definition eines Webservers verwendet wird, das heißt, es handelt sich um eine Webservermethode und Parameterbeschreibung.

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

Wenn wir http://api.test.cn/xweb anfordern Services/testServer?wsdl ' Wenn die URL wie folgt mit „?wsdl“ endet, erhalten Sie eine Reihe strukturierter XML-Daten.

Ja, es ist nur ein Klumpen...

PHP verwaltet WSDL

Als nächstes geht es darum, wie man es versteht und welche Methode darin den Schlüssel darstellt, alles andere ist nicht gut .

0x02 Verständnis des Beschreibungsdokuments

Als ich mir dieses XML-Dokument zum ersten Mal ansah, war es ziemlich verwirrend, aber nach der Verwendung der PHP-Erweiterung wurde es viel offensichtlicher.

<?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 verwaltet WSDL

Hier verwenden wir die SOAP-Erweiterung. Diese Erweiterung ist die in der offiziellen PHP-Kopie bereitgestellte Operationsverarbeitungs-WebServer-Diensterweiterung Parameterübertragung realisieren.

Wie aus dem obigen Bild ersichtlich ist, bietet diese Schnittstelle drei Methoden, nämlich:

xxxxUserInfo

xxxxResumeNum

download**

Die relevante Datenstruktur bezieht sich auf den Parameternamen und den Parametertyp in der Methode. Beispielsweise erfordert die Methode xxxxUserInfo drei Parameter vom Typ Zeichenfolge. Entspricht jeweils in0, in1 und in2.

Hinweis

Der Parameterschlüssel muss hier in0 sein, was ein beliebiger Parametername ist, der kein Array erfordert, weder benutzerdefiniert noch von beiden Parteien vereinbart. Als ich mit dem Schreiben der Schnittstellenmethode begann, führte ich die Übertragung auf der Grundlage der in der Schnittstellenkopie angegebenen Parameterbeschreibungen durch, wie zum Beispiel: err_msg (zeigt Fehlerinformationen an), err_code (zeigt Fehlercodierung an) und Datum (endgültige übertragene Daten). Ändern Sie es dann in ein geordnetes Array und geben Sie die entsprechenden Parameter nacheinander ein. Zu diesem Zeitpunkt ist der Schlüssel 0 bis 2. Aber nachdem ich es versucht hatte, funktionierte es immer noch nicht. Mit der Mentalität, es auszuprobieren, habe ich schließlich versucht, int0 als Schlüsselnamen und den entsprechenden err_msg-Inhalt als Wert zu verwenden. OK~, perfekte Lösung.

Code:

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

}
?>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn