1. TCP、UDP、HTTP与Soap协议
TCP
面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
- TCP提供的是一种可靠的数据流服务。
- 采用“带重传的肯定确认”技术来实现传输的可靠性。
- TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
UDP
面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
- UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
HTTP
是一个通信协议,通过网络传输信息。
SOAP
是一个基于XML的协议交换消息,可以使用HTTP来传输这些信息。事实上HTTP是SOAP消息的最常见的传输工具。
关系
- soap将信息进行XML的序列化后,再用http协议的方式再打包进行传送,传送的方式还是tcp或者udp。做个比喻就好理解了。tcp 和 udp 都是公路,暂且把tcp认为是一般公路,udp高速公路,soap和http就都是汽车,那么soap和http都可以在tcp和udp上跑。说soap可以通过http来传送,实际就是说soap是小轿车,http是装轿车的卡车,把soap的信息装到http里面,然后再运输,当然走的道路还是tcp或udp。说soap可以通过http协议来传输,这句话不太准确,比较准确第说法是:soap信息可以通过http协议包装后通过tcp或udp传输。
- SOAP被描述为:简单的对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP协议可以简单地理解为:SOAP=RPC+HTTP+XML,即采用HTTP作为通信协议,RPC(Remote Procedure Call Protocol 远程过程调用协议)作为一致性的调用途径,XML作为数据传送的格式,从而允许服务提供者和服务客户经过防火墙在Internet上进行通信交互。
SOAP与HTTP的区别
- 都是底层的通信协议,请求包的格式不同,soap包是XML格式,http纯文本格式
- soap 的 可以传递结构化的 数据,http只能传输纯文本数据;
- SOAP:简单对象访问协议 http是标准超文本传输协议
- SOAP相对http(
post/get)由于要进行xml解析,速度可能会有所降低。
2. webservice接口与HTTP接口
2.1 webservice接口测试
测试webservice接口,可以使用soapUI来进行测试,下面简单用soapUI来调用webservice接口:
1. 打开soapUI,新建一个soap工程

2. 我们以天气预报的wsdl地址为例,导入soapUI查看其中的所有接口信息
wsdl地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

3. 查看接口及报文,输入参数直接进行调用


发送报文:
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/"> |
接收报文:
1 | <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
- 根元素:Envelope。
- Header元素:不是强制出现,由程序员控制,主要用于携带一些额外的信息,比如用户名、密码。
- Body元素:调用正确时,Body元素的内容应该遵守WSDL要求的格式。
2.2 HTTP接口
这里不再做详细介绍,就是我们常用的post、get、delete、put等接口,结果返回状态和json。例如使用postman测试:
接口地址:http://api.xxxxxxxx.com:6895/api/live/stop
返回结果如下:
1 | { |
3. php中四种webservice实现的简单架构方法及实例
3.1 PHP本身的SOAP
所有的webservice都包括服务端(server)和客户端(client)。要使用php本身的soap首先要把该拓展安装好并且启用。下面看具体的code
服务端:
1 |
|
客户端:
1 | $soap = new SoapClient(null, array('location' = 'http://localhost/test/server.php', 'uri' = 'http://soap/')); |
3.2 PHPRPC
首先到官网(http://www.phprpc.org/zh\_CN/)上面去下载最新版的phprpc,解压之后会有相关的文件,我们把文件进行划分(服务端和客户端文件)如下
服务端文件:
1 | dhparams |
客户端文件:
1 | phprpc_client.php |
我们把服务端文件放在服务端文件夹中,然后把客户端文件放在客户端文件夹中,之后再服务端文件夹中新建个文件(server.php)作为服务,然后再客户端新建个文件(client.php)作为客户端,各自代码如下:
1 | //服务端: |
3.3 开源的NUSOAP
首先到网上去下载最新版的nusoap,现在的最新版本是0.9.5的,解压之后会得到一个lib文件夹,把这个文件分别放到服务端和客户端各一份,然后再服务端和客户端分别建立
server.php和client.php文件,作为通信文件。
1 | //服务端 |
3.4 HessianPHP
hessian其实我个人认为他不是一个webservice,只能说是类似而已。因为它不具备webservice的那些特性。它支持的语言比较多我们现在只需要研究php版本的HessianPHP就行了,下载最新版本是v2.0.3的,解压之后会得到一个src的目录,这个目录使我们需要使用的一个核心文件夹。 我们把名字重命名为HessianPHP然后分别分别放到server和client端,然后分别建立
server.php和client.php文件。
1 | //服务端 |
以上四种方式为web开发过程中常用到的webservice通信方式。用的最多的是nusoap,phprpc在性能上面和nusoap基本上差不多,只不过,phprpc在商业上是收费的。还有个hessianPHP采用的二进制方式传输数据流,其实也是各有千秋啊。更多的详细资料去找百度和谷歌吧。
本文早期发布于个人 CSDN 博客:查看原文