视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php如何处理wsdl
2020-11-03 18:24:09 责编:小采
文档
0x00 前言

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

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

0x01 wsdl是什么

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

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

没错,就是一坨...

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

0x02 理解描述文档

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

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

";

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

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

● xxxxUserInfo

● xxxxResumeNum

● download**

相关的数据机构则是指方法中参数名称,及参数类型。比如xxxxUserInfo方法,需要三个string类型的参数。分别对应in0,in1和in2。

此处的传参数key必然是in0,也就是一个无需数组,用户自定义或双方约定好的任意参数名称。在开始写接口方法的时候,我是根据接口文案中给予的参数说明如:err_msg(表示错误信息),err_code(表示错误编码),date(传输的最终数据)进行传输的。后改为有序数组,挨个填入对应参数,此时key就是的0到2。可试过之后还是没什么卵用,最终包着试一试的心态,尝试一下将int0作为键名,对应的err_msg内容作为值。ok~,完美解决。

Code:

<?php
/**
 * @author 0x584A
 * 获取WSDL接口数据
 */
class getwsdlTest extends PHPUnit_Framework_TestCase
{
 public $apiurl = 'http://api.test.cn/xwebservices/testServer?wsdl';
 private static $soapClientHandler;
 private $infoArr = [
 'err_msg' => 'false',
 'err_code' => '0',
 'date' => '此处是要传输的数据'
 ];
 public function setUp()
 {
 $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl');
 print "提供的方法
";
 print_r($client->__getFunctions());
 print "相关的数据结构
";
 print_r($client->__getTypes());
 print "

";
 }
 /**
 * xxxxUserInfo方法
 */
 public function testxxxxUserInfoData()
 {
 try {
 $ApiInfo = $this->infoArr;
 //set request param
 $parameter = array(
 'in0' => $ApiInfo['err_msg'],
 'in1' => $ApiInfo['err_code'],
 'in2' => $ApiInfo['date']
 );
 $result = $this->getSoapClientHandler()->synchUserInfo($parameter);
 //调用结果返回异常
 if (!$result instanceof stdClass) {
 throw new Exception("调用synchUserInfo结果出现异常:" . json_encode($result));
 }
 //调用接口状态码,输出对应错误详情
 if ($result->out == '01') {
 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, 'SimpleXMLElement', 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;
 }
}
?>

推进:《PHP教程》

下载本文
显示全文
专题