面向消息的服务与SOAP详解
立即解锁
发布时间: 2025-08-18 01:35:27 阅读量: 3 订阅数: 5 

# 面向消息的服务与SOAP详解
## 1. SOAP概述
SOAP(Simple Object Access Protocol)是可扩展标记语言(XML)的一种Web服务扩展。这一简单而强大的协议为企业流程在提供服务(或交换信息)方面带来了诸多优势。它能高效地搭载超文本传输协议(HTTP),助力企业在互联网上进行信息交换。SOAP作为首选协议取得巨大成功,得益于其简单性和优雅性。
当前版本的SOAP消息可携带文本和二进制信息。文本信息可封装在消息体中,非文本信息则能以MIME附件形式携带。SOAP消息能在任意两个通信伙伴应用程序之间以同步或异步模式进行交换。
SOAP是基于XML的消息传递协议和规范,设计初衷是简单且可扩展。它有助于交互应用程序在分布式环境中以分散方式交换信息。该协议的一个有趣之处在于,它能通过“线路”传输数据,并为目标系统上的交互应用程序在数据交付后发起响应动作指定了一系列规则。与其他类似的线路协议(如用于CORBA的Internet Inter - ORB协议(IIOP)、用于DCOM的对象远程过程调用(ORPC)以及用于RMI的Java远程方法协议(JRMP))相比,这些协议本质上是二进制的,而SOAP具有独特优势。
SOAP在设计上是一种简单、轻量级且与传输协议无关的协议,这使得它能在其他选定的协议上进行传输。随着互联网和万维网的出现与普及,HTTP成为SOAP传输的首选。SOAP在HTTP上广受欢迎的一个主要原因是HTTP具备在Web上进行分布式数据交换的能力。
## 2. SOAP约定
为满足分布式数据交换的需求,SOAP规范定义了四个重要约定:
### 2.1 消息信封
SOAP消息信封定义了描述SOAP消息内容和包装的约定,同时也规定了在两个应用程序之间的消息交换中如何路由和处理SOAP消息。
### 2.2 编码规则
编码规则集提供了将应用程序信息映射到XML的约定。这些规则基于标准化的XML Schema定义,紧密模拟了大多数流行编程语言支持的标准数据类型和结构。重要的指导原则包括:
- 所有编码消息的元素和属性都要使用正确的SOAP命名空间约定。
- 消息中不使用文档类型定义(DTD)处理指令(PI)和DTD。
- 使用SOAP消息的`<Header>`元素及相应属性等。
### 2.3 RPC约定
远程过程调用本质上是面向请求 - 响应的调用。当发起消息请求时,数据会被序列化并传输到目标应用程序。同样,从目标系统收到的响应消息会被反序列化并处理。SOAP规范为执行RPC定义了规则,该约定涉及数据如何通过请求调用进行路由,并通过响应接收结果。
### 2.4 绑定
SOAP在设计上独立于任何传输协议,原则上,SOAP消息可在任何传输协议上交换,而不影响消息的结构和内容。构建SOAP消息时,需在消息中明确指示与底层传输协议的绑定。生成SOAP消息的工具会负责将消息绑定到传输协议。尽管SOAP在设计上与传输协议无关,但企业应用程序更倾向于将SOAP消息绑定到HTTP,因为HTTP正日益成为企业界事实上的传输协议。不过,使SOAP与传输协议无关的原因是为了让SOAP在消息交换方面具有前瞻性。如果未来企业通信领域出现更好、更优雅的传输协议,SOAP也能搭载该新协议。
## 3. SOAP剖析
### 3.1 基本SOAP模型
在探讨基本SOAP模型前,先看看传统邮政系统的消息结构。在传统邮政系统中,消息写在一张或多张纸上,并寄给特定的人。纸上的消息本质上是传统消息系统的内容或主体部分,部分消息还可附带一个或多个附件,如照片、录音带等。普通邮件按原样送达收件人,而“挂号”或“认证”等特殊类别邮件则为传统消息系统提供了安全性和可靠性等服务。信封上目标人的姓名和地址是消息的接收者,消息只能由接收者打开并处理。
SOAP消息系统的结构与传统消息系统有相似之处,但也存在明显差异。SOAP消息结构主要有两部分:第一部分是主MIME,类型为text/xml;第二部分是MIME附件。单个SOAP消息中可以有任意数量的MIME附件。SOAP消息系统的主要部分是text/xml部分,它定义了一个`<Envelope>`元素,该元素包含两个重要元素:`<Header>`元素和`<Body>`元素。根据SOAP规范,有以下重要规则:
- 任何SOAP消息中,`<Envelope>`和`<Body>`元素是必需的。
- `<Header>`元素是可选的。
- 若SOAP消息中同时存在`<Header>`和`<Body>`元素,`<Header>`元素及其内容先出现,然后是`<Body>`元素及其内容。
- `<Header>`和`<Body>`元素可包含一个或多个条目。
- `<Header>`元素内的条目称为头部条目。
- `<Body>`元素内的条目称为主体条目。
SOAP消息的`<Body>`用于携带文本信息,通常称为有效负载。若要传输非文本信息,SOAP 1.1带附件和SOAP 1.2规范允许二进制数据以MIME编码附件形式携带,但需注意,二进制内容仅作为`<Envelope>`元素的一部分发送,而非`<Body>`元素。
### 3.2 详细SOAP模型
SOAP结构由三个基本XML元素组成:`<Envelope>`元素、`<Header>`元素和`<Body>`元素。
#### 3.2.1 `<Envelope>`元素
这是SOAP消息结构中的根元素,根据SOAP规范是必需的。它作为整个SOAP消息的容器元素。该元素大量使用了命名空间约定,示例中使用的前缀“SOAP - ENV”与统一资源标识符(URI)“http://schemas.xmlsoap.org/soap/envelope”相关联。`<Envelope>`元素使用了重要属性“encodingStyle”,该属性可出现在`<Envelope>`或其内部的其他元素中。若将此属性包含在任何主体条目中,该属性声明的编码将适用于该元素及其所有子元素。若使用SOAP编码,“encodingStyle”属性通常出现在`<Envelope>`元素中。
```xml
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.xmethids.net/sd/CATrafficService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsld/soap/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" >
<SOAP-ENV:Header >
</SOAP-ENV:Header >
<SOAP-ENV:Body >
</SOAP-ENV:Body >
</SOAP-ENV:Envelope >
```
#### 3.2.2 `<Header>`元素
在SOAP消息结构中,`<Header>`元素是可选的,但在企业应用的实际场景中很少如此。它是一个强大的元素,有助于构建健壮且灵活的分布式企业系统。该元素支持一个或多个头部条目,头部条目是SOAP消息结构中`<Header>`元素最重要的部分。
头部条目旨在为`<Body>`元素传输的有效负载提供服务。通过提供`<Header>`元素及其条
0
0
复制全文
相关推荐










