SOAP1.1规范
By www.coolhou.com 灰石
( http://blog.csdn.net/lmstone )
( LimingMail1998@yahoo.com.cn )
文档描述: SOAP是Web Services中重要的技术。 文档经历: 1. 2005-10-27 开始文档历程
|
1. 节录
SOAP 是一个在分布式环境中使用XML 交换信息的通讯协议,其中包含了三个部份:一个信封中(envelope)定义如何处理讯息的基础结构;一组程序代码撰写规则的集合用以表达应用程序定义数据型别的执行个体;以及描述远程过程调用和回应的协议。SOAP 也可以和许多其它通讯协议联合使用。然而,本文件中定义的连结只会描述如何使用SOAP 联合HTTP 和HTTP Extension Framework 协同工作。
2. 简介
SOAP 使用XML 在分布式的环境(点对点)中提供一种简单结构和型别信息的交换机制,SOAP自身并不会定义任何应用程序的语法,SOAP 定义了表达应用程序语法的机制(利用模块化的封装模式和在模块中标记数据的机制)。这个功能让SOAP 可以用于广泛的各类型系统之中。
SOAP 包含三个部份:
l SOAP 信封中定义了表达讯息中包含什么的基础结构;谁应该处理这个讯息; 无论讯息是选择性或强制性。
l SOAP 程序代码撰写规则定义了一个序列化的机制,这个机制用于交换应用程序定义数据型别的执行个体。
l SOAP RPC定义用于描述远程过程调用和响应的协议。
除了SOAP 信封、SOAP 程序代码撰写规则和SOAP RPC 协议以外,SOAP 也定义了两种通讯协议的连结方式,其中包含描述SOAP 讯息如何在HTTP[ 5]讯息中传送(协同或不协同HTTP Extension Framework[6]工作)。
2.1. 设计目标
SOAP 的主要设计目标就是要具备简单性和延伸性,这表示它包含了来自传统讯息系统的数个功能,并且分布式对象系统不是核心SOAP 规格的一部份,这些功能包含:
l Distributed garbage collection
l Boxcarring or batching of messages
l Objects-by-reference(需要有Distributed garbage collection)
l Activation(需要有Objects-by-reference)
2.2. 标记协议
本文件中的名称空间前置字「SOAP-ENV」和「SOAP-ENC」分别与SOAP 名称空间「http://schemas.xmlsoap.org/soap/envelope 」和「schemas.xmlsoap.org/soap/encoding」联合使用。
本文件中的名称空间前置字「xsi」是与XML Schemas 规格 [11] 中定义的URI「 http://www.w3.org/1999/XMLSchema-instance」联合使用;同样的,名称空间前置字「xsd」是与规格 [10] 中定义的URI 「 http://www.w3.org/1999/XMLSchema 」联合使用;名称空间前置字「tns」用于指定目前文件的名称空间目标。
「Some-URI」的名称空间URI 代表某些应用程序相依(application-dependent)或执行环境相依(context-dependent)的URI [4]。
这个规格也使用在RFC-2616 [5] 中描述的Backus-Naur Form(BNF)。
2.3. SOAP 讯息的范例
在本范例中,GetLastTradePrice SOAP 请求传送至StockQuote 服务。SOAP Envelope 元素为XML 文件中的最顶层元素,以代表该文件为SOAP 讯息,本范例显示了 第六节 中定义的HTTP连结。
范例1 嵌在HTTP 请求中的SOAP 讯息
SOAP Message Embedded in HTTP Request 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 讯息
SOAP Message Embedded in HTTP Response 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> |
3. SOAP 讯息交换模式
SOAP 的原理基本上是从传送者至接收者的单方向传输,但是如同上述范例所示,SOAP 讯息交换通常会和商业上的伙伴以 请求/响应 的方式建置。
SOAP 是非常有弹性的技术,可以为特定网络系统所需要的特性以最佳化的方式建置。举例来说,在 第6 节 中描述的HTPP 连结提供了以HTTP 响应方式传递的SOAP 响应讯息,并使用同一个联机阶段为输入的请求。
接收SOAP 讯息的SOAP 应用程序必须依次执行下列的动作:
1. 识别供该应用程序处理的SOAP 讯息每一个部份(请参阅 5.2.2 节)。
2. 确认该应用程序支持步骤1 中识别的每一个部份(请参阅 5.2.3 节),某些不会影响输出的选择性部份会被忽略(请参阅 5.4 节)。
3. 如果SOAP 应用程序不是该讯息的最终目的,那么在转传讯息之前先移除步骤1中所识别的部份。
4. SOAP 和XML 的关联性
所有的SOAP 讯息都使用XML 程序代码撰写(请参阅 [7] 以取得相关于XML 的更多信息)。
SOAP 应用程序应该要在所有的元素中都包含正确的SOAP 名称空间,SOAP 应用程序必须能够在其接收的讯息中处理SOAP 名称空间,并且必须能够忽略名称空间错误的讯息(请参阅第 5.4 节)。同时它也许应该能够处理没有SOAP 名称空间的SOAP 讯息,并且将这些没有名称空间的讯息视为具备正确的SOAP 名称空间。
SOAP 定义两种名称空间(请参阅 [8] 以取得相关于XML 名称空间的更多信息):
• SOAP Envelope 有名称空间识别项
「http://schemas.xmlsoap.org/soap/envelope/」。
• SOAP Serialization 有名称空间识别项
「http://schemas.xmlsoap.org/soap/encoding/」。
SOAP 讯息中绝对不能包含文件类别定义(DTD)和处理指令(PI)[7]。
SOAP 使用本机、未限定类别「ID」的「id」属性以指定一个程序代码撰写元素的唯一识别项;
SOAP 使用本机、未限定类别「uri-reference」的「href」属性以指定该值的参照,这些方式都遵守XML Specification [7]、XML Schema Specification [11] 和XML Language Specification[9]。
除了使用SOAP mustUnderstand 属性(请参阅第 5.2.3 节)和SOAP actor 属性(请参阅第 5.2.2 节)以外,它通常也允许属性和属性值出现在XML 执行个体或架构中-这就表示在DTD或架构中有默认值或固定值的话,在语法上是同于出现在执行个体中。
5. SOAP Envelope
SOAP讯息是XML文件,该文件中一定要包含SOAP Envelope和SOAP Body,而SOAP Header是选择性的。在本节定义中元素和属性的名称空间识别项是「 http://schemas.xmlsoap.org/soap/envelope/ 」。SOAP 讯息包含下列各项:
1. Envelope 是XML 文件的顶端元素,代表该文件为SOAP 讯息。
2. Header 是一般用于在分布式环境中的SOAP 讯息中新增功能的机制,不需要事先与商业伙伴建立合约。SOAP 定义了一些属性用于在Header 中指定「谁」处理该功能,以及它是选择性或强制性(请参阅第 5.2 节)。
3. Body 就是接收者所要接收讯息的容器(请参阅第 5.3 节),SOAP 定义了一个元素供Body 使用,即为Fault 元素用以报告错误。
语法规则如下:
1. Envelope
o 该元素名称为「Envelope」。
o 该元素必须出现在SOAP 讯息中
o 该元素可以包含名称空间宣告,以及额外的属性。如果存在额外属性,属性必须使用名称空间限定(namespace-qualified);一样的,该元素也许会包含子元素,如果存在子元素,这些子元素必须使用名称空间限定,并且位于Body 元素之后。
2. Header(请参阅第 5.2 节)
o 该元素名称为「Header」。
o 该元素不一定要出现在SOAP 讯息中,如果SOAP 讯息中存在Header元素,那么Header 元素必须直接为SOAP Envelope 元素的第一个子元素。
o 所有的SOAP Header 元素的直接子元素必须名称空间限定。
3. Body(请参阅第 5.3 节)
o 该元素名称为「Body」。
o 该元素必须出现在SOAP 讯息中,并且必须为SOAP Envelope 元素的直接子元素。如果存在SOAP Header 元素的话,那么它就必须直接位于其后,否则SOAP Body 元素就必须为SOAP Envelope 元素的直接子元素。
o SOAP Body 元素的直接子元素不一定要名称空间限定,SOAP 定义了SOAP Fault 元素用以报告错误(请参阅第 5.4 节)。
5.1.
5.1.1. SOAP encodingStyle 属性
SOAP encodingStyle 通用属性可以指定用于SOAP 讯息的序列规则,这个属性不一定要出现在任何元素中,并且有效范围从宣告该属性的元素内容开始及其所有的子元素。
该属性的值是一个依照顺序排列的清单,其中包含一或多个URI 以识别要连续套用的规则,值的范例如下:
"http://schemas.xmlsoap.org/soap/encoding/" "http://my.host/encoding/restricted http://my.host/encoding/" "" |
在 第6 节 中SOAP 定义的序列规则是由URI「http://schemas.xmlsoap.org/soap/encoding/」所识别,使用这个特定序列的讯息应该要使用SOAP encodingStyle 属性。还有,所有的URI
语法上都使用「http://schemas.xmlsoap.org/soap/encoding/」开始。
没有长度的URI(zero-length URI,"")值是用于指定该元素的程序代码撰写样式并没有特定要求。
5.1.2. Envelope Versioning Model
SOAP 讯息必须有Envelope 元素联合名称空间「http://schemas.xmlsoap.org/soap/envelope/」使用,如果一个SOAP 应用程序接收了一个讯息,而该讯息的SOAP Envelope 元素使用和上述不同的名称空间,该应用程序就必须将其视为版本错误并忽略该讯息。如果讯息使用例如HTTP的 请求/响应 通讯协议,应用程序就必须响应一个SOAP VersionMismatch 错误码讯息(使用「http://schemas.xmlsoap.org/soap/envelope/」名称空间)。
5.1.3. SOAP Header
SOAP 提供了一个具弹性的方式延伸讯息,以及一种模块化的方式与商业伙伴之间通讯。延伸讯息的典型范例就是在标头项目中建置例如验证、交易管理、付款方式等等信息。
Header 元素必须为SOAP Envelope XML 元素的第一个直接子元素,所有Header 元素的直接子元素就称为标头项目(header entry)。
标头项目标程序码撰写规则如下:
1. 标头项目由它的完整元素名称所识别,其中包含名称空间URI 和本机名称,SOAPHeader 的直接子元素必须名称空间限定。
2. SOAP encodingStyle 属性不一定会被用于指定标头项目标程序码撰写样式(请参阅第 5.1.1 节)。
3. SOAP mustUnderstand 属性(请参阅第 5.2.3 节)和SOAP actor 属性(请参阅第 5.2.2 节)不一定要用于指定如何处理项目或谁来处理(请参阅 第5.2.1 节 )。
5.2.
5.2.1. 使用Header 属性
在本节定义的SOAP Header 属性决定SOAP 讯息的接收者应该如何利用第3 节所描述的方式处理该讯息。产生SOAP 讯息的SOAP 应用程序应该只会在SOAP Header 元素的直接子元素使用SOAP Header 属性,如果SOAP Header 属性没有套用于SOAP Header 元素的直接子元素之中,SOAP 讯息的接收者必须忽略所有的SOAP Header 属性。
标头使用元素识别项「Transaction」的范例-「mustUnderstand」属性的值为「1」;元素识别项「Transaction」值为「5」,程序代码撰写方式如下:
<SOAP-ENV:Header> <t:Transaction xmlns:t="some-URI " SOAP--ENV:mustUnderstand="1"> 5 </t:Transaction> </SOAP-ENV:Header> |
5.2.2. SOAP actor 属性
SOAP讯息从出发点至目的地之间会经过许多SOAP中间媒介,所谓SOAP中间媒介就是SOAP的应用程序,这些应用程序具备接收和转传SOAP 讯息的能力,接收标头元素的接收者绝对不能将该标头元素转传到下一个SOAP 应用程序,但是可以插入相似的标头元素。
SOAP actor 通用属性可以用于指定标头元素的接收者,SOAP actor 属性的值是URI,特别的URI「http://schemas.xmlsoap.org/soap/next/」可以指定该标头元素试图传递的下一个SOAP应用程序。
删除SOAP actor 属性指出接收者即为SOAP 讯息的最终点。
该属性一定要依次出现在SOAP 讯息执行个体中(请参阅 第4 节 和 第5.2.1 节 )。
5.2.3. SOAP mustUnderstand 属性
SOAP mustUnderstand 通用属性用于指出标头项目接收者是否一定要处理标头项目,标头项目的接收者是由SOAP actor 属性所定义(请参阅第 5.2.2 节),mustUnderstand 属性的值可以为「1」或「0」,如果没有指定SOAP mustUnderstand 属性值,预设为「0」。
如果该属性值为「1」,标头项目的接收者必须处理标头讯息,否则会传回错误(请参阅第 5.4 节)。
该属性一定要依次出现在SOAP 讯息执行个体中(请参阅 第4 节 和 第5.2.1 节 )。
5.2.4. SOAP Body
SOAP Body 元素必须为SOAP Envelope XML 元素的第一个直接子元素,如果存在SOAPHeader 元素的话,那么它就必须直接位于其后,否则SOAP Body 元素就必须为SOAP Envelope元素的直接子元素。
所有的Body 元素的直接子元素都称为数据主体项目(body entry),并且每一个数据主体项目在SOAP Body 元素中都是独立的元素。
数据主体的程序代码撰写规则如下:
1. 数据主体项目由它的完整元素名称所识别,其中包含名称空间URI 和本机名称,SOAP Body 元素的直接子元素不一定要名称空间限定。
2. SOAP encodingStyle 属性不一定会被用于指定数据主体项目标程序码撰写样式(请参阅第 5.1.1 节)。
SOAP 定义了一个数据主体项目,即为Fault 项目用于报告错误(请参阅 5.4 节)。
5.3.
5.3.1. SOAP Header 和Body 的关联性
虽然Header 和Body 被定义为独立的元素,事实上它们之间还是有关联性。在数据主体项目和标头项目之间的关联性如下:如果标头项目使用预设的actor 属性值和SOAP mustUnderstand属性值为「1」时,基本上这种情况和数据主体项目在语法上是相同的,预设的actor 属性是不使用actor 属性(请参阅 5.2.2 节)。
5.4. SOAP Fault
SOAP Fault 元素用于传送SOAP 讯息中的错误 和/或 状态信息。如果使用SOAP Fault 元素,它一定要以数据主体的方式出现,并且只能够在Body 元素中出现一次。
SOAP Fault 元素定义下列四个子元素:
l faultcode元素由软件使用以提供算法的机制来识别错误,faultcode 必须存在于SOAP Fault 元素中并且其值必须如 [8] 中所定义的完整名称。
l faultstring 元素试图提供可供人类读取的错误解释,并且不执行演算处理。Faultstring 元素相似于HTTP (请参阅 [6] )所定义的「Reason-Phrase」,faultstring 必须存在于SOAP Fault 元素中并且应该至少要提供某些错误的解释信息。
l faultactor 元素试图提供在讯息的路径中哪一个节点引起了错误(请参阅 第3 节 ),它与SOAP actor 属性相似(请参阅第 5.2.2 节),不同之处在于标头项目是指定目的地,而faultactor 元素是指出错误的来源。faultactor 属性的值以URI 来识别,但并非SOAP 讯息终点的应用程序都必须在其SOAP Fault 元素中包含faultactor 元素。
l detail元素试图指出特定应用程序的Body 元素发生错误信息,如果Body元素的内容无法顺利处理,就必须存在detail;请注意detail 绝对不能够用于传递属于标头项目的错误信息。
在Fault 元素中缺少detail 元素指定错误跟Body 元素的处理并没有相关性,这样可以用于区分是否Body 元素被正确处理或并没有错误发生。
detail 元素的直接子元素称为明细项目(detail entry),而且每一个明细项目在detail 元素中都是独立的元素。
detail 项目标程序码撰写规则如下
1. 明细项目由它的完整元素名称所识别,其中包含名称空间URI 和本机名称,明细元素的直接子元素不一定要名称空间限定。
2. SOAP encodingStyle 属性不一定会被用于指定明细项目标程序码撰写样式(请参阅第 5.1.1 节)。
5.5. SOAP Fault Codes
在本节中定义的faultcode 值必须用于faultcode 元素中,这些faultcode 值的名称空间识别项为「http://schemas.xmlsoap.org/soap/envelope/」,在这个规格中使用这个名称空间只是个建议(并不是必须)。
预设的SOAP faultcode 值为了与现存的faultcode 值向后兼容是以一种延伸的方式定义,这个机制非常相似于HTTP(请参阅 [5] )的基本状态类别1xx、2xx 和3xx 等等。SOAP faultcode值不使用整数,并且使用XML 完整名称定义(请参阅 [8] ),字符「.(点)」用于分开faultcode值,范例如下:
Client.Authentication |
本文件中定义的faultcode 值集合:
名称 | 意义 |
VersionMismatch | SOAP Envelope 元素的处理发现无效的名称空间(请参阅第 5.1.2 节)。 |
MustUnderstand | SOAP Header 元素的直接子元素无法解译或不遵从SOAP mustUnderstand 属性值为「1」的处理程序。 |
Clien | 错误的Client 类别指出讯息的形成不正确或没有依次包含适当的信息。举例来说,讯息可能缺少正确的验证或付款方式信息,通常这个方式可以用来指定讯息不应该不经过修改过就重传。 |
Server
| 错误的Server 类别指出讯息无法处理,原因是讯息本身的内容没有直接的属性,但是仍然需要处理该讯息。举例来说,处理时和服务器的通讯没有响应,讯息也许会在稍后的时间点就可以顺利处理。 |
6. SOAP Encoding
SOAP 的程序代码撰写样式是基于简单的型别系统,该型别系统具备程序语言、数据库和半结构数据中的一般性型别系统功能。型别可以为简单的型别,或是由数个部份组合而成的型别。首先,任何标记法的架构都会有一致的型别系统描述,例如XML 语法的架构一样;次之,已知的型别系统架构会确认XML 语法架构,就建立了XML 执行个体。相反的,所产生的XML 执行个体就会与这些规则一致,并且会建立最初的值图形。
在本节中所定义的元素和属性的名称空间识别项是「http://schemas.xmlsoap.org/soap/encoding/」,之前所展示的程序代码撰写范例是假设所有的名称空间宣告都在较高的元素层级。
7. 使用SOAP 和HTTP 协同工作
本节描述如何在HTTP 中使用SOAP 与(或不与)HTTP Extension Framework 协同工作,连结SOAP 和HTTP 可以取得许多优点,例如SOAP 的弹性和HTTP 的丰富功能。使用HTTP 传送SOAP 讯息并不表示这样就会完全取代HTTP 的语法,因为SOAP 的语法会对应HTTP 语法。
SOAP 会遵守HTTP 请求/响应 讯息模式,在HTTP 的请求中提供SOAP 请求的参数,并且在HTTP 回应中包含SOAP 回应参数。
当在HTTP 讯息中包含SOAP 数据主体时,HTTP 应用程序必须遵循RFC 2376 [3] 的媒体型别「text/xml」。
7.1. SOAP HTTP 请求
纵使SOAP 可以和多种HTTP 请求方法联合使用,这个连结只能定义在HTTP POST 中的SOAP请求(请参阅 第8 节 以了解如何使用SOAP for PRC 和 第7.3 节 以了解如何使用HTTPExtension Framework)。
7.1.1. SOAPAction HTTP Header Field
SOAPAction HTTP 请求标头字段可以用于指定SOAP HTTP 请求的意图,该值为一URI 以识别该请求的意图。当发布SOAP HTTP 请求时,HTTP 客户端必须使用这个标头字段。
soapaction = "SOAPAction" ":" [ <">URI-reference <"> ] URI-reference = <as defined in RFC 2396 [4]> |
SOAPAction 标头字段的内容由服务器使用,例如防火墙以在HTTP 中适当的筛选HTTP 请求讯息。使用空字符串("")值的标头字段表示SOAP 讯息是由HTTP Request-URI 提供,没有值表示没有指定任何的意图。
举例来说:
SOAPAction:"http://electrocommerce.org/abc#MyMessage" SOAPAction:"myapp.sdl" SOAPAction:"" SOAPAction: |
7.2. SOAP HTTP 回应
SOAP HTTP 遵循HTTP 状态码(HTTP 的通讯状态信息)的语法,举例来说,2xx 状态码指出包含SOAP 组件的客户端请求已经顺利接收、解译并且接受等等。
当处理请求时发生SOAP 错误,SOAP HTTP 伺服程序必须发布HTTP 500「内部服务器错误」响应,并且在响应中包含SOAP 讯息(其中包含SOAP Fault 元素)以指出SOAP 处理错误。
7.3. HTTP Extension Framework
SOAP 讯息也可以和HTTP Extension Framework [6] 一起使用以辨识SOAP HTTP 请求的内容。
是否使用HTTP Extension Framework 或是简单的HTTP 是取决于通讯双方的原则和能力的问题,客户端可以藉由使用强制性的延伸宣告或「M-」HTTP 方法名称前置字以强制使用HTTPExtension Framework;服务器可以藉由使用510「Not Extended」HTTP 状态码以强制使用HTTPExtension Framework。
用于指定SOAP 使用Extension Framework 的延伸识别项是「http://schemas.xmlsoap.org/soap/envelope/」。
7.4. SOAP HTTP 范例
范例3 使用POST 的SOAP HTTP
SOAP HTTP Using POST POST /StockQuote HTTP/1.1 Content-Type:text/xml;charset="utf-8" Content-Length:nnnn SOAPAction:"http://electrocommerce.org/abc#MyMessage" <SOAP-ENV:Envelope... HTTP/1.1 200 OK Content-Type:text/xml;charset="utf-8" Content-Length:nnnn <SOAP-ENV:Envelope... |
范例4 使用HTTP Extension Framework 的SOAP
SOAP Using HTTP Extension Framework M-POST /StockQuote HTTP/1.1 Man:"http://schemas.xmlsoap.org/soap/envelope/";ns=NNNN Content-Type:text/xml;charset="utf-8" Content-Length:nnnn NNNN-SOAPAction:"http://electrocommerce.org/abc#MyMessage" <SOAP-ENV:Envelope... |
8. 使用SOAP 执行RPC
SOAP 的设计目标之一是利用XML 的弹性和延伸性来封装和交换RPC 呼叫,本节定义远程过程调用和响应的统一表现方式。
使用HTTP 为通讯协议连结的情况下,RPC 呼叫会自然对应HTTP 请求,并且PRC 回应会自然对应HTTP 回应。然而,使用SOAP 执行PRC 并不只限于和HTTP 通讯协议连结。
您需要下列的信息以使用一个方法呼叫:
l 目标对象的URI。
l 方法的名称。
l 选择性的方法标记。
l 方法的参数。
l 选择性的标头数据。
8.1. RPC 和SOAP Body
PRC 方法呼叫和响应都使用下列方式于SOAP Body 元素中传送(请参阅 第5.3 节 ):
l 方法呼叫模式化为一结构。
l 方法呼叫视为单一结构,该结构中每一个 in 或 in/out 参数都包含存取器,该结构的命名和型别都和方法名称一致。
l 每一个 in 或 in/out 参数视为一个存取器,具有对应于参数名称的名称和对应于参数型别的型别。
l 方法响应是模式化为一结构。
l 方法响应视为单一结构,该结构中包含传回值和每一个out 或in/out 参数的存取器,第一个存取器就是参数后面传回的值,次序和方法标记中的次序一样。
l 每一个参数存取器都有一个相对于参数名称的名称和相对于参数型别的型别,传回值的存取器名称并不明显;同样地,结构名称也不明显。然而,方便之处在于方法名称后面会附加字符串「Response」。
8.2. RPC 和SOAP Header
使用标头元素的范例就是在讯息中附带传送一个TransactionID,因为TransactionID 并非标记的一部份,且一般是由基础结构组件所掌控(而非由应用程序代码),所以没有直接的方式在这种呼叫(于标头中传递非标记信息)中传递必要的信息。藉由新增一个项目至标头中,并且为其命名一个固定名称,在接收端的交易管理员就可以萃取出TransactionID。
9. 安全性考量
在本文件中没有说明的论点即为某些专供整合性和私人信息保护的方法,本文件的较新版本将会说明这些考量论点。
10. 参考数据
[1] S. Bradner, "The Internet Standards Process" - Revision 3, RFC2026, Harvard University , October 1996.
[2] S. Bradner, "Key words for use in RFCs to Indicate Requirement Levels", RFC2119, Harvard University , March 1997.
[3] E. Whitehead, M. Murata, "XML Media Types", RFC2376, UC Irvine, Fuji Xerox Info.Systems, July 1998
[4] T. Berners-Lee, R. Fielding, L. Masinter, "Uniform Resource Identifiers (URI):GenericSyntax", RFC 2396, MIT/LCS, U.C. Irvine, Xerox Corporation, August 1998.
[5] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, U.C. Irvine, DEC W3C/MIT, DEC, W3C/MIT,W3C/MIT, January 1997
[6] H. Nielsen, P. Leach, S. Lawrence , "An HTTP Extension Framework", RFC 2774, Microsoft,Microsoft, Agranat Systems
[7] W3C 建议标准「The XML Specification」。
[8] W3C 建议标准「Namespaces in XML」。
[9] W3C Working Draft「XML Linking Language」,本草案还在修订中。
[10] W3C Working Draft「XML Schema Part 1: Structures」,本草案还在修订中。
[11] W3C Working Draft「XML Schema Part 1: Datatypes」,本草案还在修订中。
[12] Transfer Syntax NDR, in「DCE 1.1: Remote Procedure Call」。
[13] N. Freed, N. Borenstein , "Multipurpose Internet Mail Extensions (MIME) Part One: Format
of Internet Message Bodies", RFC2045, Innosoft, First Virtual, Novem-ber1996
11. SOAP Envelope 范例
11.1. 呼叫请求的范例
范例5 相似于范例1,但是有强制性的标头
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:Header> <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1"> 5 </t:Transaction> </SOAP-ENV:Header> <SOAP-ENV:Body> <m:GetLastTradePrice xmlns:m="Some-URI"> <symbol>DEF</symbol> </m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
范例6 相似于范例1,但是有多个请求参数
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:GetLastTradePriceDetailed xmlns:m="Some-URI"> <Symbol>DEF</Symbol> <Company>DEF Corp</Company> <Price>34.1</Price> </m:GetLastTradePriceDetailed> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
11.2. 响应的范例
范例7 相似于范例2,但是有强制性的标头
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:Header> <t:Transaction xmlns:t="some-URI" xsi:type="xsd:int " mustUnderstand=="1"> 5 </t:Transaction> </SOAP-ENV:Header> <SOAP-ENV:Body> <m:GetLastTradePriceResponse xmlns:m="Some-URI"> <Price>34.5</Price> </m:GetLastTradePriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
范例8 相似于范例2,但是有结构
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"> <PriceAndVolume> <LastTradePrice> 34.5 </LastTradePrice> <DayVolume> 10000 </DayVolume> </PriceAndVolume> </m:GetLastTradePriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
范例9 相似于范例2,但是强制性的标头发生错误
HTTP/1.1 500 Internal Server Error Content-Type:text/xml;charset="utf-8" Content-Length:nnnn <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:MustUnderstand</faultcode> <faultstring>SOAP Must Understand Error</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
范例10 相似于范例2,但是掌控数据主体发生错误
HTTP/1.1 500 Internal Server Error Content-Type:text/xml;charset="utf-8" Content-Length:nnnn <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Server Error</faultstring> <detail> <e:myfaultdetails xmlns:e="Some-URI"> <message> My application didn 't work </message> <errorcode> 1001 </errorcode> </e:myfaultdetails> </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |