问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

你好! php 如何获取数据, wsdl已知, 请赐教

发布网友 发布时间:2022-04-07 09:22

我来回答

3个回答

懂视网 时间:2022-04-07 13:43

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结构的数据给你。

没错,就是一坨...

28421c3fc7d991f4c4487b03993a819.png

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

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 "

";

05653125ef9f7976837243150044a23.png

这里我们用到了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教程》

热心网友 时间:2022-04-07 10:51

有wsdl的地址后直接通过 file_get_contents或者curl获取内容,取到内容后怎么解析就要看wsdl的数据结构了,你把地址给我,我看看能不能给你写个解析类。追问  //谢谢你的关注 有时间希望你加我510849525, 我想通过php建立一些查询,并展//示数据,获取数据

  // url:http://10.10.1.22:8080/colvir-cap-service/SOAPService?wsdl
由于是内网 我就直接发给你wsdl 和 xsd 文件, 这里贴不下, 方便的话加一下qq
  

热心网友 时间:2022-04-07 12:09

使用PHP的xmlReader类,可以读取XML中的内容。追问谢谢你 ,现在我可以访问wsdl文件, 我想在客户端获取一些数据, 如果方便 , 留一下联系方式 , 这里放不下很多的代码

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 许昌到南阳独山有多少公里 请问 许昌到南阳的汽车经过叶县的时候都在 叶县哪里停车 许昌到南阳高速多远 许昌火车站到南阳火车站坐火车还是公交?价格怎样? 从许昌到南阳七峰山汽车大巴需要多长时间到达 从许昌东站如何去南阳(坐公交 走高速) 从许昌到南阳理工学院都可以坐什么交通工具?哪个比较方便?价位都怎样? 许昌到南阳多长时间,许昌到南阳有多远,多少公里数 许昌到南阳有没有火车坐? 许昌到南阳坐长途汽车,快车和慢车得多长时间到达? 有许昌到南阳赊店古镇直达汽车吗 许昌到南阳的长途汽车里程是多少公里 “新丰好大雪,天寒兽不奔。待寻藏刀处,尽多可杀人。”出自哪儿? 许昌到南阳坐汽车需要多少钱 从许昌到南阳怎么去? 提供一下众里寻他千百度的全诗 请问许昌市到南阳市的汽车在哪坐方便,多少钱,走告诉吗,路上需要多久? 急寻翻译!急寻!! 许昌到南阳的末班车几点 “众里寻他千百度”出自哪首诗? 国语配音网有哪些?要效果好一点的。 观看DVD-9(或DVD)视频影片时,如何打开国语配音或国语字幕? 【猜测】柯南剧场版第13弹这次在大陆上映票房大概会有多少 公主嫁到国语版|公主嫁到国语版全集|公主嫁到国语版在线观看 《我有爱人了》百度云无删减完整版在线观看,崔文锡导演的 在网易buff里怎样才能只? 国语配音的韩剧 - 信息提示 介绍些好看点的韩剧,能从韩剧里学到什么 2009年2月9日 周星驰电影的配音是谁(国语) 为什么电影院不放映国语配音电影译制片 为什么银行卡的密码只有六位,安全吗? 在哪能找到国语版的《名侦探柯南》的全集? - 信息提示 香港电影国语配音是那里人配得 为什么就感觉他们说得普通话 好听的多。七情六欲感觉特别的突出。 最新的高清国产(有国语配音的也成)电影有哪些 能下载有资源的 为什么银行卡的密码是6位的,为什么不是自选 为什么大家不喜欢看国语配音的外国片但影院排片率很却高? 为什么银行卡设置密码只是六位数 去哪里找国语配音的电影?