一、 SOAP简介
1. 什么是SOAP
ü 简单对象访问协议
ü 一种通讯协议
ü 用于应用程序之间通讯
ü 独立于平台
ü 独立于语言
ü 基于XML
ü 简单,易扩展
ü 允许绕过防火墙
2. SOAP不能做什么
² 分布式碎片收集
² 成批消息传送
² 对象引用
² 激活机制
二、 SOAP语法
1. SOAP构建模块
一个SOAP消息包含以下元素
ü 必须的Envelope元素,标识此文档为SOAP消息
ü 可选的Header元素,包含头部消息
ü 必选的Body元素,包含调用和响应消息
ü 可选的Fault元素,提供处理过程中的错误消息。
2. SOAP语法规则
ü 必须用XML来编码
ü 必须用SOAP Envelope命名空间
ü 必须用SOAP Encoding命名空间
ü 不能包含DTD引用?
ü 不能包含XML处理指令 ?
3. SOAP消息基本结构
<?xml version=”1.0”?>
<soap:Envolope
xmlns:soap=http://www.w3.org/2001/12/soap-envelope
soap:encodingStyle=” http://www.w3.org/2001/12/soap-encoding" >
<soap:Header>
……
</soap:Header>
<soap:Body>
……
<soap:Fault>
……
</soap:Fault>
</soap:Body>
</soap:Envolope>
三、 SOAP Envelope元素
1. SOAP Envelope元素
强制使用的Envelope元素是SOAP消息的根元素,它可以把XML文档定义为SOAP消息
xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope
<?xml version=”1.0”?>
<soap:Envelope
xmlns:soap=” http://www.w3.org/2001/12/soap-envelope”
soap:encodingStyle=” http://www.w3.org/2001/12/soap-encoding">
……
</soap:Envelope>
2. xmlns:soap命名空间
3. encodingStyle元素
encodingStyle元素用于定义文档中使用的数据类型,此属性可以出现在任意的SOAP元素中,并会被应用到该元素及所有子元素上。SOAP消息没有默认编码格式。
四、 SOAP Header元素
1. SOAP Header元素
Header元素可以包含有关SOAP消息的应用程序专用信息(比如认证、支付、包序号等)。如果Header元素被提供,他必须是Envelope元素的第一个子元素
注:所有Header元素的直接子元素,必须是合格的命名空间。?
<?xml version=”1.0”?>
<soap:Envelope
xmlns:soap=” http://www.w3.org/2001/12/soap-envelope”
soap:encodingStyle=” http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
<m:Trans xmlns:m=”http://www.msbai.com/transactions” mustUnderstand=”1”>234</m:Trans>
</soap:Header>
……
</soap:Envelope>
SOAP在默认的命名空间(http://www.w3.org/2001/12/soap-envelope)中,定义了三个属性(attribute),分别是:mustUnderstand、actor、encodingStyle
2. actor属性
沿着消息路径经过不同的端点,SOAP消息可以从某个发送者传播到某个接收者。
并非SOAP消息的所有部分都会传送到SOAP消息的最终端点,另一方面,SOAP消息可以传递给消息路径上的一个或者多个端点。
SOAP的actor属性可以用于将Header元素寻址到一个特定的端点?
todo ..
3. mustUnderstand属性
SOAP的mustUnderstand属性可以用来标识元素对于接收者来说是强制的还是可选的。
如果想Header元素的某个子元素添加了mustUnderstand=”1”,则指示处理此头部的接收者必须认可此元素,否则必须失效。
1) 语法
soap:mustUnderstand=”0|1”
2) 示例
4. encodingSytle属性
上节已讲
五、 SOAP Body元素
1. SOAP Body元素
SOAP Body元素的直接子元素可以是合格的命名空间。(?)SOAP的默认命名空间中,定义了Body元素内部的一个元素。及SOAP的Fault元素,用于指示错误信息。
SOAP请求:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m=”http://www.msbai.com/price”>
<m:Item>apple</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
SOAP响应:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<m:GetPriceResponse xmlns:m=”http://www.msbai.com/price”>
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Envelope>
六、 SOAP Fault元素
可选的SOAP Fault元素用来保存SOAP消息的错误和状态信息。
1. SOAP Fault元素
Fault元素必须是Body元素的子元素,只能出现一次。
SOAP的Fault元素有下列子元素
<faultcode> 供识别故障的代码
<faultstring> 错误说明
<faultactor> 错误引发者 ?
<detail> 明细,保存应用程序的专用错误信息。
2. SOAP Fault Codes
VersionMismatch SOAP Envelope元素的无效命名空间被发现
MustUnderstand Header元素的某个直接子元素,设置了mustUnderstand属性,但是无法被理解
Client 客户端上行数据包错误,消息没有被正确的构成,或者包含了不正确的信息。
Server 服务器错误
七、 SOAP HTTP Binding
1. HTTP协议
2. HTTP + XML = SOAP
SOAP请求可能是POST请求,也可能是GET请求
POST请求规定至少包含两个HTTP请求头:Content-Type和Content-Length
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-length:nnn
八、 SOAP实例
请求:
POST /InStock HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
响应:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>