MENU

php如何处理wsdl,SOAP协议的请求

June 29, 2022 • 已被 206 位童鞋围观过 • 代码分享

前言

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

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

wsdl是什么

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

详见:https://www.php.cn/faq/437443.html

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

没错,就是一坨...

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

理解描述文档

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

<?php
$client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl');
print "\n提供的方法\n";
print_r($client->__getFunctions());
print "相关的数据结构\n";
print_r($client->__getTypes());
print "\n\n";

返回效果如下

这里我们用到了SOAP扩展,这个扩展是PHP官方文案中出示操作处理WebServer服务扩展,最终我们也是通过它来实现参数传输。

在上面的图片中可以理解出,这个接口提供了一个方法,是:

● qryCustBaseInfo

相关的数据机构则是指方法中参数名称,及参数类型。比如qryCustBaseInfo方法,需要1个string类型的参数。对应in0

好了 我们开始上代码

<?php
//定义XML 键值
$xml["in0"] = <<<EOT
<?xml version='1.0' encoding='UTF-8' ?>
<Root>
<qryVer>1.00.00.00</qryVer>
<qryOrgCode>XXX</qryOrgCode>
<qrySrc>XXX</qrySrc>
<desOrgCode>XXX</desOrgCode>
<interCode>XXX</interCode>
<qryType>XXX</qryType>
<certType>XXX</certType>
<qryValue>XXX</qryValue>
<servPwd>XXX</servPwd>
</Root>
EOT;

$url = 'http://api.test.cn/xwebservices/testServer?wsdl';
$client = new SoapClient($url);
$result = $client->qryCustBaseInfo($xml);//直接使用方法请求数据
//输出Json数据
$json=json_encode(simplexml_load_string($result->out));
print_r($json);
Last Modified: September 28, 2023