[转]SOAP消息全面解析
SOAP消息可以是XML文件,该文件中一定要包含SOAP Envelope(封装)和SOAPBody(体),而SOAP Header(头)则是可以选择性的。
SOAP消息包含下列各项:
·Envelope是XML文件的顶层元素,代表该文件为SOAP消息。
·Header提供了向SOAP消息中添加关于这条SOAP消息的某些要素(feature)的机制,不需要事先与商业伙伴建立合约。SOAP定义了一些属性用于在Header中指定“谁”处理该功能,以及它是选择性的还是强制性的。
·Body就是接收者所要接收消息的容器。SOAP定义了一个元素供BoO使用,即Fault元素,用以报告错误。
(1)SOAP Envelope
SOAP Envelope消息必须有Envelope元素和名称空间lattp://schemas.xmlsoap.org/soap/envelope/来使 用,如果一个SOAP应用程序接收了一个消息,而该消息的SOAP Envelope元素使用和上述不同的名称空间,则该应用程序就将其视为版本错误并忽略该消息。如果消息使用。H\'I’TP的请求/响应通讯协议,应用 程序就必须响应一个SOAP的VersionMismatch错误码消息(使用 “http://schemas.xmlsoap.org/soap/envelope/”名称空间)。
(2)SOAP Header
为相互通信的团体之间提供了一种很灵活的机制,在无需预先协定的情况下,以分散但标准的方式扩展消息。可以在SOAP.Header中添加条目实现这种扩 展,如认证、事务管理、支付等。Header元素是SOAP封装元素的第一个直接子元素。Header元素的所有直接子元素称作条目。条目的编码规则如 下:
. 一个条目有它的完整的元素名(包括名域URi和局部名)。SOAP Header的直接子元素必须有名称限制。
. SOAP encodingStyle属性可以用来指示条目所用的编码形式。
. SOAP mustLJnderstand属性和SOAPactor属性可以用来指示如何处理这个条目以及由谁来处理。
(3)SOAP Body
SOAP:Body提供一个简单的用于与消息的最终接收者交换信息的机制,这些信息都是必须处理的机制。Body元素的典型应用是包含序列的RPC调用和 错误报告。Body元素在代码中是SOAP Envelope元素的一个直接子元素。如果包含:Header元素,则Body元素必须直接跟随Header元素之后,是Header元素的直接下一个 兄弟元素,否则Body元素必须是Envelope元素的第一直接子元素。所有Body元素的直接子元素被称为Body条目,同时每一个:Body条目都 是SOAP Body元素中的一个独立元素。
SOAP只预定义了一个Body条目:Fault用于向调用方报告错误。SOAP Fault元素是用于在SOAP消息中传输错误及状态信息。如果SOAP消息需要包含SOAP Fault元素,则SOAP Fault元素必须作为一个:Body条目出现,并在Body元素内只能出现一次。
SOAP Fault元素定义了如下子元素:
.faultcode。faultcode元素是满足了那些以算法机制来标识错误的软件的需要。faultcode元素必须在SOAP Fault元素中出现,同时它的值必须是属于其后定义的一个修饰名。SOAP定义了一个很小的SOAP错误代码的集合,用于覆盖基本的SOAP错 误。
.faultstring。faultstring元素提供了错误代码的解释,它不是为程序处理而设。faultstring元素有点类似于HTTP中定义 的“Reason.Phrase”。faultstring元素必须在SOAP Fault元素中出现,同时提供一些解释错误种类的信息。
.faultactor。faultactor的值是一个URi,它指出在消息路径上是哪个节点导致错误发生的信息。它类似于SOAP actor属性,不过它不是用于指示Header条目的接收者,而是用于指示错误源。faultactor元素的值是一个标识该源的一个uRI。作为 SOAP 消息的非最终接收者的应用程序必须在SOAP Fault元素中包含faultactor元素,而消息的最终接收者可以使用faultactor元素来明确地指明是它生成了该错误。
·detail。detail元素是用于传输与Body元素相关的应用程序特别的错误信息。如果Body元素中的内容不能被成功地处理时,detail元 素必须出现。detail元素不能被用于传输属于。Header条目的错误信息。详细的属于Header条目的错误信息必须在Header条目中传输。
若Fault元素中不出现detail元素则表明其中的错误与Body元素的处理无关。这可以用于区分在错误情况下Body元素是否被处理过。 detail元素的所有直接子元素都被称为detail条目,同时每个detail条目都作为detail元素中的一个独立的元素进行编码。
(4)SOAP消息的传送
SOAP消息从发送方到接收方是单向传送,并且经常以请求/应答的方式实现。例如,HTTP绑定使SOAP应答消息以HTTP应答的方式传输,并使用同一个连接返回请求。不管SOAP被绑定到哪个协议,SOAP消息在终节点之外的中间节点也可以处理。
一个接收SOAP消息的SOAP应用程序按照以下步骤来处理消息:
. 识别应用程序需要的SOAP消息的所有部分;
· 检验应用程序是否支持第一步中识别的消息中所有必须需要的部分并处理它。如果不支持,则丢弃消息。在不影响处理结果的情况下,处理器可能忽略第一步中识别出的可选部分。如果这个SOAP应用程序不是这个消息的最终目的地,则在转发消息之前删除第一步中识别出来的所有部分。
为了正确处理一条消息或者消息的一部分,SOAP处理器需要理解所用的交换方式(单向、请求/应答、多路发送等)、以及这种方式下接收者的任务、RPC机 制(如果有的话)的使用、数据的表现方法或编码,还有其他必须的语义。尽管属性(如SOAP Encoding Style)可以用于描述一个消息的某些方面,但这个规范并不强制所有的接收方也必须有同样的属性并取同样的属性值。即交互双方的SOAP消息并不一定要 遵循同样的格式设定,而只需要以一种双方可理解的格式交换信息就可以了。
SOAP消息都使用XML形式编码。一个SOAP应用程序产生的消息中,所有由SOAP定义的元素和属性中必须包括正确的名称。SOAP应用程序必须能 够处理它接收到的消息中的SOAP名称,并且也可以处理没有SOAP名称的SOAP消息,就像它们有正确的名称一样。