Heim >Backend-Entwicklung >PHP-Tutorial >Wie geht PHP mit WSDL um?

Wie geht PHP mit WSDL um?

藏色散人
藏色散人nach vorne
2019-12-03 14:24:293197Durchsuche

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?

Zusammenfassend lässt sich sagen, dass es sich um ein Dokument im XML-Format handelt, das zur Beschreibung der Definition eines Webservers verwendet wird, das heißt, es handelt sich um ein Web Beschreibung der Servermethode und der Parameter.

Einzelheiten finden Sie unter: https://www.php.cn/faq/437443.html

Wenn wir http://api.test.cn anfordern /xwebservices /testServer?wsdl', ähnlich dieser URL, die mit ?wsdl endet, werden Ihnen eine Reihe strukturierter XML-Daten zur Verfügung gestellt.

Ja, es ist nur ein Klumpen...

Wie geht PHP mit WSDL um?

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

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

Wie geht PHP mit WSDL um?

Hier verwenden wir die SOAP-Erweiterung, die in der offiziellen PHP-Kopie bereitgestellte Operationsverarbeitungsdiensterweiterung. Letztendlich verwenden wir sie auch, um Parameter zu realisieren Übertragung.

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, benutzerdefiniert ist oder von beiden Parteien vereinbart wird . 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;
    }
}
?>

Bewerben: „PHP-Tutorial

Das obige ist der detaillierte Inhalt vonWie geht PHP mit WSDL um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen