日期:2010-08-10  浏览次数:20419 次

SOAP协议规范
1.  简介  
SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它通过提供一个有标准组件的包模型和在模块中编码数据的机制,定义了一个简单的表示应用程序语义的机制。这使SOAP能够被用于从消息传递到RPC的各种系统。  

soap包括三个部分  

soap封装(见第4节)结构定义了一个整体框架用来表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。
SOAP编码规则(见第5节)定义了用以交换应用程序定义的数据类型的实例的一系列机制。
SOAP  RPC表示(见第7节)定义了一个用来表示远程过程调用和应答的协定。
虽然这三个部分都作为SOAP的一部分一起描述,但它们在功能上是相交的。特别的,封装和编码规则是在不同的名域中定义的,这种模块性的定义方法增加了简单性在SOAP封装,SOAP编码规则和SOAPRPC协定之外,这个规范还定义了两个协议的绑定,描述了在有或没有HTTP扩展框架[6]的情况下,SOAP消息如何包含在HTTP消息[5]中被传送。  

1.1  设计目标
SOAP的主要设计目标是简单性和可扩展性,这意味着传统的消息系统和分布对象系统的某些性质不是SOAP规范的一部分。这些性质包括:  

分布式碎片收集
成批传送消息
对象引用(要求分布式碎片收集)
激活机制(要求对象引用)
1.2  符号约定
这篇文章中的关键字  "MUST",  "MUST  NOT",  "REQUIRED",  "SHALL",  "SHALL  NOT","SHOULD",  "SHOULD  NOT",  "RECOMMENDED",  "MAY",  和"OPTIONAL"的解释在RFC-2119  [2]中。  这篇文章中用到的名域前缀  "SOAP-ENV"  和"SOAP-ENC"分别与"http://schemas.xmlsoap.org/soap/envelope/";  和"http://schemas.xmlsoap.org/soap/encoding/";关联。整篇文档中,名域前缀“xsi”被假定为与URI"http://www.w3.org/1999/XMLSchema-instance“(在XMLSchema规范[11]定义)相连。类似的,名域前缀”xsd“被假定为与URI"http://www.w3.org/1999/XMLSchema";(在[10]中定义)相连。名域前缀”tns“用来表示任意名域。所有其它的名域前缀都只是例子。
名域URI的基本形式”some-URI“表示某些依赖于应用程序或上下文的URI[4]。这个规范用扩展BNF(在RFC-2616[5]  描述)描述某些结构。  

1.3  soap消息举例
在这个例子中,GetLastTradePrice  SOAP  请求被发往StockQuote服务。这个请求携带一个字符串参数和ticker符号,在SOAP应答中返回一个浮点数。XML名域用来区分SOAP标志符和应用程序特定的标志符。这个例子说明了在第6节中定义的HTTP绑定。如果SOAP中管理XML负载的规则完全独立于HTTP是没有意义的,因为事实上该负载是由HTTP携带的。在Appendix  A中有更多的例子。  

例1  在http请求中嵌入soap消息  

post  /stockquote  http/1.1
Host:
www.stockquoteserver.com
Content-Type:  text/xml;
charset="utf-8"
Content-Length:  nnnn
SOAPAction:
"Some-URI"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/";>
<SOAP-ENV:Body>
<m:GetLastTradePrice  xmlns:m="Some-URI">
<symbol>DIS</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>  

下面是一条应答消息,包括http消息,soap消息是其具体内容  :  

例2  在http应答中嵌入soap消息  

http/1.1  200  ok
Content-Type:  text/xml;
charset="utf-8"
Content-Length:
nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/";/>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse  xmlns:m="Some-URI">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>  

2.  soap消息交换模型
SOAP消息从发送方到接