php通过soap扩展调用WebService接口

本文中的PHP版本:PHP Version 7.4.13

Webservice的一些相关概念和简介

什么是webservice?

webservice也可以叫xml web service webservice,轻量级的独立的通讯技术。它是基于web的服务,服务端提供的服务接口让客户端访问。是一项跨平台跨语言的整合方案。


Webservice是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。


WebService技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据WebService规范实施的应用之间,无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。


webservice技术结构:

协议层:TCP/IP

应用层: http协议

SOAP: http && xml


为什么要使用webservice?

它是跨语言调用的解决方案。


WebService能够对外提供WebService服务(比如说我们可以将我们的服务提供给第三方来进行调用),我们也可以使用别人提供的WebService服务,如 IP地址查询、天气预报、证券信息、手机号归属地查询、中英文翻译等。


下面 列举几个网络上提供的免费的WebService服务地址:

http://www.webxml.com.cn/zh_cn/index.aspx

http://ws.webxml.com.cn/WebServices/WeatherWS.asmx



webservice中的一些概念

WSDL(web service definition language webservice 定义语言),webservice服务需要通过wsdl文件来说明自己有什么服务可以对外调用。并且有哪些方法、方法里面有哪些参数等信息。


wsdl文件中的内容 是基于XML(可扩展标记语言)去定义的。

①、wsdl对应一个 .wsdl 格式的文件类型。

②、定义了webservice的服务端和客户端应用进行交互的传递数据和响应数据的格式和方式等。

③、一个webservice对应唯一一个wsdl文档。


SOAP(simple object access protocal简单对象访问协议),webservice是通过http post协议进行发送和接收请求的, 发送的内容(请求报文)和接收的内容(响应报文)都是采用xml格式进行封装,这些特定的http消息头和XML内容格式的数据就是SOAP协议。(消息头 即指的是http中的header头。XML内容 即指的是http中的body数据)

①、一种简单、基于http和XML的协议

②、soap消息:请求和响应消息

③、http+xml报文



SEI(webservice endpoint interface webservice的终端接口),webservice服务端用来处理请求的接口,也就是发布出去的接口。


webservice相对于http(post/get)有哪些优点?

①、接口中提供的方法和要求的参数一目了然,非常清晰。

②、不用担心大小写问题。

③、不用担心中文需要urlencode的问题。

④、代码中不用多次声明认证(账号,密码)参数。

⑤、传递参数可以为数组,对象等。



正文开始。。。

这不。。最近要跟一个第三方进行接口对接,但是。。人家第三方的接口是用.NET写的WebService接口,c#调用通过,现在需要使用php来进行调用,折腾了好久,参考了各种资料!!经过各种探索,相关的PHP调用webservice的过程如下:

打开php相关扩展:

soap.so(windows系统对应的扩展后缀为:.dll)该扩展必须要开启

curl.so(windows系统对应的扩展后缀为:.dll)该扩展必须要开启

openssl.so(windows系统对应的扩展后缀为:.dll)视情况而开启,如果webservice接口服务端 是https,则该扩展需要开启

第三方接口信息(由于隐私设置,只展示第三方接口的部分参数信息)

接口地址:http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx

1、accessCode参数:
公安:gongan
环保:huanbao
消防:xiaofang
应急:yingji
市场监管:shichangjianguan
城管:chengguan
 
2、inCodeInfo参数:test123

3、诉求提交接口
方法名称:SetAppealInterface(string accessCode,string inCodeInfo,string dataInfo)

入参:
string accessCode:加密的接入码
string inCodeInfo:校验码
string dataInfo:数据信息,格式如下
    <root><element des="信件信息">
    <attribute id="Title" des="标题">信件标题</attribute>
    <attribute id="username" des="网民用户名">网民用户名</attribute>
    <attribute id="address" des="地址">地址</attribute>
    <attribute id="email" des="邮箱">邮箱</attribute>
    <attribute id="mobile" des="手机">手机</attribute>
    </element>
    </root>
    

出参:
成功:唯一数据查询码(十位数字)
失败:0

php调用webserice接口代码如下:

//$client = new \SoapClient('http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx')

/*
注意:上面这样写会报:PHP Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: 
Couldn't load from 'http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx' : 
EndTag: '</' not found
*/ 

正确写法是 在webservice地址后面加上?wsdl 即:下面这个正确写法:
$client = new \SoapClient('http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx?wsdl');

//dataInfo参数比较多,这里我们单独使用一个变量来存储使用,注意:下面的xml串 不能有空格、换行
$datainfo_xml_str = '<root><element des="信件信息"><attribute id="Title" des="标题">测试标题</attribute><attribute id="username" des="网民用户名">test</attribute><attribute id="userid" des="网民用户id">123456</attribute><attribute id="sex" des="性别">1</attribute><attribute id="address" des="地址">测试地址</attribute><attribute id="email" des="邮箱">test@qq.com</attribute><attribute id="mobile" des="手机">13954569999</attribute></element></root>';

//参数这样传递 先包装一下
$param = array('accessCode' => 'huanbao', 'inCodeInfo' => 'test123', 'dataInfo' => $datainfo_xml_str);

//使用__soapCall()方法来进行调用
$p = $client->__soapCall('SetAppealInterface', array('parameters' => $param)); //参数1:是webservice中的方法名  参数2:是 往方法里面传入的具体参数

print_r($p->SetAppealInterfaceResult); //输出:2203284111(对应上面接口信息中的成功出参(10位数字))  当然了,这里也可以先输出一下变量$p,看看输出结果是什么

注意,在php调用某个方法后,其soap对象 就会自动产生一个对应的Result方法 用来显示调用结果,如 上面的 被调用端的WebService中的"SetAppealInterface"方法,调用端就有相应的"SetAppealInterfaceResult"方法。

关于php的soap扩展的缓存问题:

php对soap的wsdl默认是开启缓存的,缓存时间默认1天,如果对方的webservices接口中的几个方法是用来查询的话,那对我们就不友好了。。。假如说 第一次调用对方的接口,对方webservices接口返回 空数据,如果对方接口在1天之内修改了返回数据,那我们再去调用的话,就会拿不到对方接口最新的数据,因为上一次调用接口返回的 空数据 被php的soap扩展给缓存了,解决办法就是关闭缓存,关闭方式如下:


代码中临时更改:

ini_set("soap.wsdl_cache", 0);
ini_set("soap.wsdl_cache_enabled", 0);
ini_set("soap.wsdl_cache_ttl", 0);


php.ini配置文件中进行修改

soap.wsdl_cache=1(改为0)
soap.wsdl_cache_enabled=1(改为0)
soap.wsdl_cache_ttl=86400(改为0)

改完php.ini后不要忘记重启php 使配置生效

尾声

关于php的soap扩展还有好多相关内置方法及使用方式,可以自行查看php官网或网上搜索使用资料 来解锁php soap扩展的更多使用姿势~!


当然了。。不仅是只能调用.NET写的webservice接口。。也可以调用java写的webservice接口,不区分语言,只要符合webservice规范,php都可以调用



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading