根据XML文档 PHP实现SOAP请求WSDL
1.解读XML文档
XML文档一般指可扩展标记语言。可扩展标记语言,标准通用标记语言的子集,简称XML。
是一种用于标记电子文件使其具有结构性的标记语言。通过各个标记计算机可以实现对标记的读取和计算,并且是严格区分大小写,每一对都必须存在关闭标签。
例子:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
<soap:Header/>
<soap:Body>
<tem:WS_SingleTime>
<!--Optional:-->
<tem:strTagNum>PPU1_PI_9008_8</tem:strTagNum>
<!--Optional:-->
<tem:strTimestamp>2021-07-06 14:42:11</tem:strTimestamp>
</tem:WS_SingleTime>
</soap:Body>
</soap:Envelope>
其中:xmlns 属性可以在文档中定义一个或多个可供选择的命名空间,可在生成的时候定义和使用。对于tem则是用户生成的时候自定义的方法名称,用于在实例化soap对象后进行方法的调用。其中在tem标签中的strTagNum和strTimestamp则是其他执行方法的参数,在传递的时候以数组形式,并严格按照在xml的下标索引进行定义和赋值后进行传递。
2.SOAP和WSDL和webservice
* webservice的定义是Web service是创建可互操作的分布式应用程序的新平台。
Web service 的主要目标是跨平台的可互操作性。为了达到这一目标,Web service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。
Web Service实现业务诉求:Web Service是真正“办事”的那个,提供一种办事接口的统称
* SOAP 提供“请求”的规范:向服务接口传递请求的格式,包括方法和参数等。
你想让人家办事,总得告诉人家你想干什么吧,SOAP就是定义这个“请求”的格式的, 按照SOAP定义的“请求”格式“书写”请求就可以保证Web Service能够正确的解读
你想让它干什么以及你为它提供了什么参数。在这个请求中,
你需要描述的主要问题有:向哪个Web Service发送请求,请求的参数类型、参数值、返回值类型。这些都“填写”完毕,也就完成了符合SOAP规范的SOAP消息
* WSDL提供“能办的事的文档说明”:对要提供的服务的一种描述格式。我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型
* SOAP调用流程:
客户端:取得服务端的服务描述文件WSDL,解析该文件的内容,了解服务端的服务信息,以及调用方式。
根据需要,生成恰当的SOAP请求消息(指定调用的方法,已经调用的参数),发往服务端。等待服务端返回的SOAP回应消息,解析得到返回值。
服务端:生成服务描述文件,以供客户端获取。接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。
根据WSDL和WSML的描述,调用相应的COM对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。
3.利用PHP实现
PHP需要在php.ini的配置文件中开启以下扩展,否则提示soap class not found 的错误。
php_openssl(对于https的WSDL请求需要开启,但是还是推荐开启)
php_soap
libxml
<?php
ini_set("soap.wsdl_cache_enabled", "0"); #关闭SOAP接口请求缓存
/**
* 发送soap查询
* @param $params 传递参数 对应xml文档中的参数 ['strTagNum'=>'','strTimestamp'=>''] 对应第6行和第8行
* @param string $wsdl 请求地址 $wsdl的请求URL后面要跟上wsdl表示,否则soap会出现加载失败
* @return array
*/
function soap($params, $wsdl="http://XXXXXXX/mes2.0release/ws_phd.asmx?wsdl"){
header("Content-type: text/html; charset=utf-8");
try{
libxml_disable_entity_loader(false); #关闭 禁用加载外部实体的功能,此功能默认是开启, 如开启会出现 Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 失败的错误
#trace 是否启用调试信息,true或false
#exceptions 如果有错误发生的时候是否抛出SoapFault类型的异常。
$client = new SoapClient($wsdl,['trace'=>1,'exceptions'=>0]);
#执行XML文档中的WS_SingleTime方法 对应文档第4行
$result = $client->WS_SingleTime($params);
#将XML对象编码以后在解码为数组
$result = json_encode($result);
$result = json_decode($result,true);
return ['code'=>200,'msg'=>'查询成功','data'=>['exist'=>$result['WS_SingleTimeResult']['Value']?1:0]];
}catch (SoapFault $e){
return ['code'=>603,'msg'=>$e->getMessage()] ;
}catch(Exception $e){
return ['code'=>603,'msg'=>$e->getMessage()];
}
}
分类:
PHP
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
2017-07-08 PHP重整数组 - 客户端读取unset后的数据出现-解决方案