SOAP是我们Web Service中很常见的一个协议,SOAP确定了一种通过XML实现跨语言、跨机器传输调用的协议,WSDL更像是所提供服务的一个规范、一个文档,本篇文章介绍梳理一下他们的规则与逻辑,更好的认识一下SOAP协议及WSDL描述文件。
SOAP简单对象访问协议
SOAP(Simple Object Access Protocol)简单对象访问协议是交换数据的一种规范,在Web Service中,交换带结构信息。可基于HTTP等协议,使用XML格式传输,抽象于语言实现、平台和硬件。即多语言包括PHP、Java、.Net均可支持。
优点是跨语言,非常适合异步通信和针对松耦合的C/S,缺点是必须做很多运行时检查。
相关概念
- SOAP封装(envelop),定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理。
- SOAP编码规则(encoding rules),定义了一种序列化的机制,表示应用程序需要使用的数据类型的实例。
- SOAP RPC表示(RPC representation),定义了一个协定,用于表示远程过程调用和应答。
- SOAP绑定(binding),定义了SOAP使用哪种协议交换信息。使用HTTP/TCP/UDP协议都可以。
基本结构
示例:
1 | 复制代码<?xml version="1.0"?> |
一条SOAP消息就是一个普通的XML文档,Envelope元素与Body元素(包含调用和响应信息)必须存在,Header元素(包含头部信息)和Fault元素(提供有关在处理此消息所发生的错误的信息)可以作为可选存在
SOAP Envelope元素
SOAP消息的根元素,可把XML文档定义为SOAP消息
命名空间
xmlns:SOAP命名空间,固定不变。
SOAP在默认命名空间中定义了3个属性:actor,mustUnderstand,encodingStyle。这些被定义在SOAP头部的属性可定义容器如何对SOAP消息进行处理。
- mustUnderstand属性——用于标识标题项对其进行处理的接受者来说是强制的还是可选的。(0可选1强制)
soap:mustUnderstand="0/1"
- SOAP的actor属性可用于将Header元素寻址到一个特定的端点
soap:actor="URI"
- SOAP的encodingStyle属性用于定义在文档中使用的数据类型。此属性可出现在任何SOAP元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP消息没有默认的编码方式。
soap:encodingstyle="URI"
SOAP Header元素
可选的SOAP Header元素可包含有关SOAP消息的应用程序专用信息。如果Header元素被提供,则它必须是Envelope元素的第一个子元素
1 | 复制代码<soap:Header> |
SOAP Body元素
必须的SOAP Body元素可包含打算传送到消息最终端点的实际SOAP消息。SOAP Body元素的直接子元素可以使合格的命名空间
SOAP Fault元素
用于存留SOAP消息的错误和状态消息,可选的SOAP Fault元素用于指示错误消息。如果已提供了Fault元素,则它必须是Body元素的子元素,在一条SOAP消息中,Fault元素只能出现一次。
SOAP Fault子元素:
- 供识别障碍的代码
- 可供人阅读的有关障碍的说明
- 有关是谁引发故障的信息
- 存留涉及Body元素的应用程序的专用错误信息
faultcode值描述:
- versionMismatch SOAP Envelope的无效命名空间被发现
- mustUnderstand Header元素的一个直接子元素(mustUnderstand=”1′)无法被理解
- Client 消息被不正确的构成,或包含不正确的信息
- Server 服务器有问题,因此无法处理进行下去
WSDL网络服务描述语言
WSDL(Web Services Description Language)网络服务描述语言,WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web Service。
基本结构
1 | 复制代码<definitions> |
一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。
特定实例剖析
以盛付通的一个接口为例,介绍一下整个wsdl描述文件,网址如下http://cardpay.shengpay.com/api-acquire-channel/services/receiveOrderService?wsdl
Types
数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
1 | 复制代码<xs:element name="receB2COrderRequest" type="tns:ReceB2COrderRequest"/> |
Message
通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
1 | 复制代码<wsdl:message name="receiveB2COrder"> |
Operation & PortType
Operation 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
PortType 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
1 | 复制代码<wsdl:portType name="ReceiveOrderAPI"> |
Binding
特定端口类型的具体协议和数据格式规范的绑定。
1 | 复制代码<wsdl:binding name="ReceiveOrderAPIExplorterServiceSoapBinding" type="tns:ReceiveOrderAPI"> |
Port&Service
Port 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
Service 相关服务访问点的集合。
1 | 复制代码<wsdl:service name="ReceiveOrderAPIExplorterService"> |
PHP操作示例代码
1 | 复制代码//soap版本为1.1,不缓存wsdl文件 |
小结
附wsdl示例全文:
1 | 复制代码<?xml version="1.0" encoding="utf-8"?> |
相关文章
本文转载自: 掘金