📄 soap3.htm
字号:
<P>4.1.1 SOAP encodingStyle属性</P>
<P><BR>SOAP的全局encodingStyle属性被用于指明在SOAP消息中使用哪种编序规则。该属性可以在任意元素中出现,并且其作用范围包括该元素的内容和所有其子元素中未使用该属性的所有子元素,这就象XML命名空间定义的作用范围。对于一个SOAP消息来说,没有默认的编码定义。</P>
<P></P>
<P>该属性的值是一个或多个用于标识编序规则和用于标识解序SOAP消息的规则的有序列表,其排序是按照详尽程度从大到小排列。Example
3展示了encodingStyle属性的三个例子:</P>
<P></P>
<P></P>
<P>Example 3</P>
<P><BR>encodingStyle="http://www.w3.org/2001/06/soap-encoding"encodingStyle="http://example.org/encoding/restricted
http://example.org/encoding/"encodingStyle=""</P>
<P><BR>Example values for the encodingStyle attribute</P>
<P><BR>在section
5中定义的编序规则的标识为"http://www.w3.org/2001/06/soap-encoding"。消息若要使用特别的编序应该使用SOAP
encodingStyle属性来指明。另外,所有在句法上由"http://www.w3.org/2001/06/soap-encoding"开始的URI序列表明这其中包含的所有URI都与section
5中定义的SOAP编码规则相一致。(虽然可能会添加潜在的更为严格的规则)</P>
<P></P>
<P>一个空值的URI(“”)明确地指明并未为其所包含的元素声明任何编码风格。这可以为包含的元素关闭任何声明。</P>
<P></P>
<P>4.1.2 Envelope版本模型</P>
<P><BR>SOAP并未定义一个传统的基于主辅版本号的版本模型。SOAP消息必须包含一个与命名空间"http://www.w3.org/2001/06/soap-envelope"相关联的Envelope元素。如果SOAP应用程序收到一个SOAP消息,这个消息中的Envelope元素与一个与"http://www.w3.org/2001/06/soap-envelope"不同的命名空间相关联,则该应用程序必须视其为一个版本错误并生成一个VersionMismatch
SOAP错误。SOAP VersionMismatch错误消息必须使用SOAP
1.1的信封命名空间"http://schemas.xmlsoap.org/soap/envelope/"(参阅 Appendix
C)修饰。 </P>
<P></P>
<P>4.2 SOAP Header</P>
<P><BR>SOAP提供了一个可伸缩的机制用于在分散的模块化的环境下扩展SOAP消息,而通讯双方并不需要有预先的约定知识。典型的扩展例子可以是实现一些诸如认证、事务管理以及支付的Header条目。</P>
<P></P>
<P>SOAP Header元素应当被编码为SOAP Envelope
XML文档的第一直接子元素。Header的所有直接子元素都被称为Header条目。</P>
<P></P>
<P>Header条目的编码规则包括:</P>
<P></P>
<P></P>
<P></P>
<P>一个SOAP Header条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间URI和局部名来组成。SOAP
Header元素的所有直接子元素都必须是完整修饰的。</P>
<P></P>
<P></P>
<P>SOAP encodingStyle属性可以用于指明Header条目的编码风格(参阅 section 4.1.1)。</P>
<P></P>
<P></P>
<P>SOAP actor属性(参阅 section 4.2.2)和SOAP mustUnderstand属性(参阅 section
4.2.3)可以用于指明由哪个SOAP结点来处理条目以及如何处理条目。</P>
<P></P>
<P>4.2.1 使用Header属性</P>
<P><BR>本节中定义的SOAP Header属性决定了SOAP消息的接收者应该如何处理消息(参阅 section
2)。一个生成SOAP消息的SOAP应用程序应该仅使用SOAP Header元素的直接子元素的SOAP
Header属性。而对于那些并非作为SOAP Header元素的直接子元素出现的SOAP
Header属性,SOAP消息的接受者必须忽略。</P>
<P></P>
<P>以下是一个SOAP Header的例子(Example
4),其中包含了一个元素标识Transaction和一个mustUnderstand属性及其值1,以及Transactin的值5:</P>
<P></P>
<P></P>
<P>Example 4</P>
<P><BR><env:Header
xmlns:env="http://www.w3.org/2001/06/soap-envelope" >
<t:Transaction xmlns:t="http://example.org/2001/06/tx"
env:mustUnderstand="1" > 5
</t:Transaction></env:Header></P>
<P><BR>Example header with a single header block</P>
<P><BR>4.2.2 SOAP actor属性</P>
<P><BR>EdNote: This section partially overlaps with section 2. We
expect this to be reconciled in a future revision of the
specification.</P>
<P></P>
<P>SOAP消息从生成者到达最终接受者,将潜在地沿着消息路径(message
path)经过一系列的SOAP中间介。SOAP中间介是一个能够接受和转发SOAP消息的应用程序。所有的中间介都如同最终接受者一样由一个URI来标识。</P>
<P></P>
<P>并非一个SOAP消息的所有部分都是最终接收者想要的,其中部分是路径中的一个或多个中间介所需要的。Header元素中接收者角色类似和约的接受者,他并不能将其交给其它方。也就是说,一个接收者接到其想要的一个Header元素必须不转发该Header给SOAP消息路径中的下一个应用程序,因为合约关系是存在于前二者之间的。该接收者可以插入一个类似的Header元素,但在这个情况下,和约关系存在于该应用程序及下一个Header元素的接收者之间了。</P>
<P></P>
<P>SOAP actor全局属性可以被用于指明Header元素的接收者。而SOAP
actor属性的值是一个URI。这个特别的URI"http://www.w3.org/2001/06/soap-envelope/actor/next"指明该Header元素是直接的下一个进行消息处理的SOAP应用程序想要的。这与HTTP的连接头字段的hop-by-hop
scope model的表示。</P>
<P></P>
<P>若省略SOAP actor属性,则表明接收者是SOAP消息的最终接收者。</P>
<P></P>
<P>这个属性必须出现在SOAP消息的实例中,而不能定义在相关的XML Schema中以期获得同样效果(参阅 section 3
和section 4.2.1)。</P>
<P></P>
<P>4.2.3 SOAP mustUnderstand属性</P>
<P><BR>EdNote: This section partially overlaps with section 2. We
expect this to be reconciled in a future revision of the
specification.</P>
<P></P>
<P>SOAP
mustUnderstand全局属性用于指明一个Header条目是强制的还是可选的要求接收者处理。Header条目的接收结点由SOAP
actor属性来定义(参阅 section 4.2.2)。mustUnderstand属性的值可为“0”或“1”。若没有使用SOAP
mustUnderstand属性,则在语义上等价于mustUderstand属性出现同时取值为“0”,也就是说这个条目是可选的。</P>
<P></P>
<P>若Header条目带有值为“1”的SOAP
mustUnderstand属性,则该Header条目的接收结点要么必须遵循语义(由具备完整修饰的元素名来传达)并正确地处理这些语义,要么必须宣称处理消息失败(参阅
section 4.4)。</P>
<P></P>
<P>SOAP mustUnderstand属性是为了考虑健壮地升级而设置的。所有用值为“1”的SOAP
mustUnderstand属性来标记的元素必须被认为是可以影响该元素的上级元素或同级元素的语义。而这种风格标记的元素应保证对语义的修改并不能被那些不能完全理解该修改后的语义的那些元素静默地或假设地、不正确地忽略。</P>
<P></P>
<P>该属性若要生效必须在实例中出现,而不能定义在相关的XML Schema中以期获得同样效果(参阅 section 3
和section 4.2.1)。</P>
<P></P>
<P>4.3 SOAP Body</P>
<P><BR>SOAP
Body元素提供一个简单的用于与消息的最终接收者交换强制信息的机制。而Body元素的典型应用包含序列的RPC调用和错误报告。</P>
<P></P>
<P>Body元素在编码上应当作为SOAP
Envelope元素的一个直接子元素。如果包含Header元素,则Body元素必须直接跟随Header元素,为Header元素的直接下一个兄弟元素,否则Body元素必须是Envelope元素的第一直接子元素。</P>
<P></P>
<P>所有Body元素的直接子元素被成为SOAP Body条目,同时每一个Body条目都应当编码为SOAP
Body元素里的一个独立元素。</P>
<P></P>
<P>Body条目的编码规则包括:</P>
<P></P>
<P></P>
<P></P>
<P>一个Body条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间URI和局部名来组成。SOAP
Body元素的直接子元素可以是命名空间修饰的。</P>
<P></P>
<P></P>
<P>SOAP encodingStyle属性可以被用来表明Body条目中使用的编码规则(参阅 section 4.1.1)。</P>
<P></P>
<P>SOAP定义了一个Body条目,用于报告错误的Fault条目(参阅 section 4.4)。</P>
<P></P>
<P>4.3.1 SOAP Header和Body的关系</P>
<P><BR>Header和Body在定义上是独立的,但在事实上是相联系的。一个Body条目和一个Header条目的关系是:一个Body条目在语义上与这样一个Header条目等价,该Header条目将由默认参与者(最终接受者)解释同时由值为“1”的SOAP
mustUnderstand属性标记。默认参与者可以使用actor属性缺失的方式来指明(参阅 section 4.2.2)。</P>
<P></P>
<P>4.4 SOAP错误</P>
<P><BR>SOAP Fault元素是用于在SOAP消息中传输错误或状态信息。如果SOAP消息需要包含SOAP
Fault元素的话,它必须作为一个Body条目出现,同时在Body元素内它必须不出现多于一次(至多出现一次)。</P>
<P></P>
<P>SOAP Fault元素定义了如下子元素:</P>
<P></P>
<P></P>
<P>faultcode </P>
<P></P>
<P>faultcode元素是应那些要提供一个算法上的机制来标识错误的软件的需要。faultcode必须在SOAP
Fault元素中出现,同时faultcode的值必须是如[8]中的第3节中定义的一个修饰(限制)名。SOAP定义了一个很小的SOAP错误代码的集合用于覆盖基本的SOAP错误(参阅
section 4.4.1)。</P>
<P></P>
<P>faultstring </P>
<P></P>
<P>faultstring元素是为那些错误代码提供一个人可以读懂的错误解释,它不是为程序处理而设。Faultstring元素有点类似于HTTP中定义的’Reason-Phrase’(参阅
[5], section 6.1)。faultstring必须在SOAP
Fault元素中出现,同时它至少应该提供一些解释该错误种类的信息。</P>
<P></P>
<P>faultactor </P>
<P></P>
<P>faultactor元素是为在SOAP消息路径(参阅 section
2)中是谁引起了该错误的发生这一情况描述信息。它类似于SOAP actor属性(参阅 section
4.2.2),不过它不是用于指示Header条目的接收者,而是用于指示错误源。faultactor属性的值是一个标识该源的一个URI。所谓并非作为SOAP消息最终接收者的应用程序必须在SOAP
Fault元素中包含faultactor元素。而消息的最终接收者可以使用faultactor元素来明确地指明是它生成了该错误(参阅下面的detail元素]。</P>
<P></P>
<P>detail </P>
<P></P>
<P>detail元素是用于传输与SOAP
Body元素相关的应用程序特别的错误信息。如果Body元素中的内容不能被成功地处理的时候,它必须出现。它必须不能被用于传输属于Header条目的错误信息。详细的属于Header条目的错误信息必须在Header条目中表示传输,如果需要例子的话,请参阅section
4.4.2。</P>
<P></P>
<P>若SOAP
Fault元素中不出现detail元素则表明其中的错误与Body元素的处理无关。这可以用于区分在错误情况下Body元素是否被SOAP的最终接受者处理过。</P>
<P></P>
<P>detail元素的所有直接子元素都被称为detail条目,同时每个detail条目都作为detail元素中的一个独立的元素进行编码。</P>
<P></P>
<P>Detail条目的编码规则如下(也可以参阅 example 10):</P>
<P></P>
<P></P>
<P></P>
<P>一个detail条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间URI和局部名来组成。Detail元素的直接子元素可以是命名空间修饰的。</P>
<P></P>
<P></P>
<P>SOAP encodingStyle属性可以被用来表明detail条目中使用的编码规则(参阅 section
4.1.1)。</P>
<P></P>
<P>4.4.1 SOAP错误代码</P>
<P><BR>当描述由本规范定义的错误的时候,faultcode元素必须使用在本节中定义的faultode的值。这些faultcode值的命名空间标识为"http://www.w3.org/2001/06/soap-envelope"。在现有规范之外定义的方法的规范推荐使用该命名空间(但不是必须的)。</P>
<P></P>
<P>默认的SOAP
faultcode值是按照一种可扩展的风格来定义的,它允许在维持已有的faultcode值的向后兼容的基础定义新的SOAP
faultcode值。这一机制在使用上非常类似与HTTP中基本状态类的定义1xx, 2xx, 3xx等(参阅[5]中的section
10)。不过,他们是用XML修饰名来定义(参阅[8]中的section
3),而不是用整数。“.”符号是faultcode值的分隔符,用于指明“.”左边的是一个比右边更泛化的错误代码。Example
5显示了这一特性:</P>
<P></P>
<P></P>
<P>Example 5</P>
<P><BR>Client.Authentication</P>
<P><BR>Example of an authentication fault code</P>
<P><BR>在SOAP中定义的faultcode值集合被罗列在下表。</P>
<P></P>
<P><BR><BR>Name <BR>Meaning </P>
<P><BR>VersionMismatch <BR>处理程序发现在SOAP Envelope元素中有一个非法的命名空间。(参阅
section 4.1.2) </P>
<P><BR>MustUnderstand <BR>SOAP
Header元素的一个直接子元素无法被理解或者他并不遵守由处理对象要求的SOAP
mustUnderstand属性必须取值为“1”的要求。(参阅 section 4.2.3) </P>
<P><BR>Client <BR></P>
<P>Client错误类用于指示以下错误:消息的格式有误或消息中缺乏能成功处理所必须的一些适当信息。例如,消息中可能缺乏适当的认证和支付信息。一般情况下应指明消息不应该在没有修改过的情况下重发。可参阅section
4.4来参阅Fault detail子元素的描述。<BR></P>
<P><BR>Server <BR></P>
<P>Server错误类用于表明消息无法被处理的原因,但那些属于内容上的错误并不属于该范畴,它主要被用于指示那些属于处理上的错误。例如,处理操作需要包含与一个上游处理程序进行通讯,但该程序没有响应。但该消息可能在下一个时间点上被成功处理。可参阅section
4.4来参阅Fault detail子元素的描述。<BR></P>
<P><BR>4.4.2 MustUnderstand错误</P>
<P><BR>当SOAP结点产生一个MustUnderstand错误时,它应该在产生出的出错消息中按照下面描述的的方式提供相应的Header条目。在产生的错误消息中,它应该提供Header条目来描述不能被理解的带修辞的名的细节(Qnames,由XML
Schema数据类型说明)。</P>
<P></P>
<P>每个这样的Header条目有个本地的名字为Misunderstood以及一个叫"http://www.w3.org/2001/06/soap-faults"的命名空间。每个块都有一个名为qname的不带修饰的属性,它的值为出错结点所不能理解的Header条目的Qname。</P>
<P></P>
<P>举例来说,如果最初消息的容器不能理解Example
6中的两个Header元素abc:Extension1和def:Extension2,则会产生出错消息,该消息显示在Example
7中。</P>
<P></P>
<P></P>
<P>Example 6</P>
<P><BR><env:Envelope
xmlns:env='http://www.w3.org/2001/06/soap-envelope'>
<env:Header> <abc:Extension1
xmlns:abc='http://example.org/2001/06/ext' env:mustUnderstand='1'
/> <def:Extension2 xmlns:def='http://example.com/stuff'
env:mustUnderstand='1' /> </env:Header> <env:Body> .
. . </env:Body></env:Envelope></P>
<P><BR>SOAP envelope that will cause a SOAP MustUnderstand fault if
Extension1 or Extension2 are not understood</P>
<P><BR> </P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -