Maison  >  Article  >  développement back-end  >  Comment php gère-t-il wsdl

Comment php gère-t-il wsdl

藏色散人
藏色散人avant
2019-12-03 14:24:293171parcourir

Préface 0x00

J'ai récemment écrit des interfaces. Avant cela, la transmission des données d'interface était transmise ou obtenue au format json ou xml. Mais cette fois, lors du débogage conjoint avec un tiers, ils ont fourni le format wsdl. Transformé en SB en un instant...

Google le code de test, et le test appelle l'interface tierce pour renvoyer le statut 200. Je pensais que ce serait fini si rien ne se passait, mais en m'approchant, j'ai découvert que peu importe la façon dont j'appelais leur interface, les données correctes n'étaient pas renvoyées. Plus tard, après avoir vérifié le journal, ils ont constaté qu’ils n’avaient pas du tout reçu les paramètres transmis. Ils ont été confus pendant un après-midi et une soirée avant de résoudre le problème. Je pensais que c'était assez intéressant, alors je l'ai d'abord écrit.

0x01 Qu'est-ce que wsdl

Pour résumer, c'est un document au format xml utilisé pour décrire la définition de Serveur Web, c'est-à-dire que c'est un Web Méthode du serveur et description des paramètres.

Pour plus de détails, voir : https://www.php.cn/faq/437443.html

Lorsque nous demandons http://api.test.cn /xwebservices /testServer?wsdl', similaire à cette URL se terminant par ?wsdl, un tas de données structurées XML vous seront fournies.

Oui, c'est juste une bosse...

Comment php gère-t-il wsdl

Ensuite, comment le comprendre et la méthode qu'il dit est la clé, tout le reste est en vain.

0x02 Comprendre le document de description

C'était assez déroutant lorsque j'ai regardé ce document XML pour la première fois, mais cela est devenu beaucoup plus évident après avoir utilisé l'extension 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";

Comment php gère-t-il wsdl

Ici, nous utilisons l'extension SOAP. Cette extension est l'extension du service de traitement des opérations WebServer fournie dans la copie officielle de PHP. Au final, nous l'utilisons également pour réaliser des paramètres. transmission.

Comme le montre l'image ci-dessus, cette interface propose trois méthodes, à savoir :

● xxxxUserInfo

● xxxxResumeNum

● téléchargement **

La structure de données pertinente fait référence au nom du paramètre et au type de paramètre dans la méthode. Par exemple, la méthode xxxxUserInfo nécessite trois paramètres de type chaîne. Correspondent respectivement à in0, in1 et in2.

Remarque

La clé de paramètre ici doit être in0, qui est un nom de paramètre arbitraire qui ne nécessite pas de tableau, est défini par l'utilisateur ou convenu par les deux parties . Lorsque j'ai commencé à écrire la méthode d'interface, j'ai effectué la transmission sur la base des descriptions de paramètres données dans la copie de l'interface, telles que : err_msg (indiquant les informations d'erreur), err_code (indiquant le codage d'erreur) et date (données finales transmises). Changez-le ensuite en un tableau ordonné et remplissez les paramètres correspondants un par un. À ce stade, la clé est de 0 à 2. Mais après l'avoir essayé, cela n'a toujours pas fonctionné. Finalement, avec la mentalité de l'essayer, j'ai essayé d'utiliser int0 comme nom de clé et le contenu err_msg correspondant comme valeur. OK ~, solution parfaite.

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

Promouvoir : "Tutoriel PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer