直播中
從根本上來(lái)看,SOAP消息是從發(fā)送方到接受方的一種傳輸方法,但就象前面例子中闡述的那樣,SOAP消息一般會(huì)和實(shí)現(xiàn)模式結(jié)合,例如請(qǐng)求/響應(yīng)。
SOAP的實(shí)現(xiàn)可以為特殊網(wǎng)絡(luò)系統(tǒng)的特有特征來(lái)優(yōu)化。例如,在section 6中描述的HTTP binding將SOAP響應(yīng)消息通過(guò)HTTP響應(yīng)來(lái)傳輸,使用與相對(duì)應(yīng)請(qǐng)求的同一HTTP連接。
2.1 SOAP結(jié)點(diǎn)
SOAP結(jié)點(diǎn)可以是初始SOAP發(fā)送者,可以是最終SOAP接收者,也可以是同時(shí)作為SOAP發(fā)送者和接收者的SOAP中介。SOAP并不提供一個(gè)路由機(jī)制,曾因此SOAP需要識(shí)別SOAP發(fā)送者產(chǎn)生的SOAP消息應(yīng)當(dāng)通過(guò)哪些零個(gè)或多個(gè)SOAP中介被發(fā)送到一個(gè)最終SOAP接收者。
接收到SOAP消息的SOAP結(jié)點(diǎn)必須能夠?qū)嵤┨幚?、產(chǎn)生必要的SOAP錯(cuò)誤和SOAP響應(yīng),如果合適的話還應(yīng)當(dāng)根據(jù)本規(guī)范的后續(xù)描述生成額外的SOAP消息。
2.2 SOAP角色與SOAP結(jié)點(diǎn)
當(dāng)處理一個(gè)SOAP消息的時(shí)候,SOAP結(jié)點(diǎn)將被告知應(yīng)當(dāng)以一個(gè)或多個(gè)SOAP處理角色來(lái)處理,這些SOAP角色由SOAP actor名來(lái)標(biāo)識(shí),SOAP actor的名字是一個(gè)URI。每個(gè)SOAP結(jié)點(diǎn)都必須以一個(gè)指定的角色來(lái)處理,這個(gè)角色使用命名為"http://www.w3.org/2001/06/soap-envelope/actor/next"的SOAP actor來(lái)表示,同時(shí)可以按照需要應(yīng)用零個(gè)或多個(gè)其他SOAP actor表示的額外角色。SOAP結(jié)點(diǎn)可以通過(guò)以匿名SOAP actor的角色來(lái)實(shí)施處理以使得自己成為最終SOAP接收者。當(dāng)SOAP結(jié)點(diǎn)在處理一個(gè)SOAP消息的時(shí)候,其表現(xiàn)出的SOAP角色在整個(gè)處理過(guò)程中不得更改。這是因?yàn)楸疽?guī)范只涉及如何處理單個(gè)SOAP消息而無(wú)需考慮狀態(tài),因此是否允許在處理單個(gè)SOAP消息的時(shí)候轉(zhuǎn)換角色是沒(méi)有意義的。
SOAP actor名字是用來(lái)識(shí)別SOAP結(jié)點(diǎn)的,并沒(méi)有與路由或者消息交換的語(yǔ)義相聯(lián)系。舉例來(lái)說(shuō),一個(gè)SOAP actor可以被命名為一個(gè)用來(lái)發(fā)送SOAP消息給適當(dāng)SOAP結(jié)點(diǎn)的URI。相反,也有這樣一些SOAP處理角色的名字,這些名字或者直接和消息路由相聯(lián)系(例如,http://example.org/banking/anyAccountMgr),或者和路由沒(méi)有聯(lián)系(例如,當(dāng)一個(gè)消息頭被用來(lái)攜帶一個(gè)指示,該指示用來(lái)告知任何有關(guān)的軟件該SOAP消息是長(zhǎng)期不變的,是能夠被安全的緩存和重用的,在這種SOAP消息頭中,一個(gè)URI可以用于標(biāo)識(shí)“所有緩存管理軟件”),通過(guò)名字使用這些SOAP處理角色也是合適的。
2.3 定位SOAP Header條目
SOAP header條目包含可選的env:actor屬性(參閱section 4.2.2)用來(lái)把他們定位到合適的SOAP結(jié)點(diǎn)。沒(méi)有該屬性的SOAP Header隱含地定位到一個(gè)匿名的SOAP actor,這意味著他們被處理為最終的SOAP接收者。我們把SOAP actor屬性的值(隱含的或者直接指明的)作為相應(yīng)SOAP條目(SOAP Header條目或者SOAP Body條目)的SOAP actor。
如果SOAP條目中SOAP actor(如果出現(xiàn)的話)匹配了一個(gè)SOAP結(jié)點(diǎn)的角色,或者是SOAP條目沒(méi)有actor屬性(包括SOAP Body條目)而該SOAP結(jié)點(diǎn)已經(jīng)假設(shè)為匿名SOAP處理角色,這時(shí)我們就說(shuō)SOAP條目被指向一個(gè)SOAP結(jié)點(diǎn)。
2.4 理解SOAP Header
我們認(rèn)為隨著時(shí)間的過(guò)去,會(huì)有大量的SOAP Header函數(shù)規(guī)范出現(xiàn),而且每個(gè)SOAP結(jié)點(diǎn)都可以包含一個(gè)或多個(gè)處理這些擴(kuò)展所必須的軟件。如果SOAP結(jié)點(diǎn)的軟件是完全兼容的而且實(shí)現(xiàn)了那些由條目中完整修飾的最外層元素名所傳遞的語(yǔ)義,我們說(shuō)這個(gè)SOAP Header被一個(gè)SOAP結(jié)點(diǎn)理解。
當(dāng)定位到一個(gè)SOAP結(jié)點(diǎn)的SOAP Header塊的mustUnderstand屬性為“1”,被指向的SOAP結(jié)點(diǎn)必須:或者依照由條目中完整修飾的最外層元素名傳遞的語(yǔ)義來(lái)處理SOAP塊,或者更本不處理SOAP消息而失敗(參見(jiàn)section 4.4).。
2.5 處理消息
本節(jié)陳述了SOAP消息處理規(guī)則。除非另外規(guī)定,處理必須在語(yǔ)義上等同于分別執(zhí)行下述的步驟,同時(shí)還必須按照給定的順序。注意到,無(wú)論如何在這個(gè)規(guī)范中都沒(méi)有阻止使用如并行、回滾或者其他可以在處理中提高靈活性的技術(shù),只要所有的SOAP消息、SOAP fault和應(yīng)用程序級(jí)的結(jié)果和那些直接執(zhí)行下列規(guī)則得到的結(jié)果是相同的。
如果一個(gè)或多個(gè)定位到SOAP結(jié)點(diǎn)的SOAP條目有env:mustUnderstand="1"并且沒(méi)有被結(jié)點(diǎn)理解,則產(chǎn)生一個(gè)SOAP mustUnderstand錯(cuò)誤。如果這樣一個(gè)錯(cuò)誤產(chǎn)生了,那么必須停止進(jìn)一步的處理。
處理定位到SOAP結(jié)點(diǎn)的SOAP條目,如果需要,產(chǎn)生SOAP錯(cuò)誤。當(dāng)定義env:mustUnderstand="1"時(shí),一個(gè)SOAP結(jié)點(diǎn)必須處理SOAP塊。如果沒(méi)有定義,那么SOAP結(jié)點(diǎn)可以處理或忽略該SOAP條目。如果一個(gè)SOAP條目被處理,無(wú)論如何,這個(gè)SOAP結(jié)點(diǎn)必須理解該SOAP條目而且必須以和那個(gè)SOAP條目說(shuō)明完全一致的樣式進(jìn)行處理。而對(duì)于錯(cuò)誤,無(wú)論是那種,也必須和SOAP條目的說(shuō)明一致。有可能處理特殊SOAP條目會(huì)控制或者決定其他SOAP條目的處理順序。例如,一個(gè)SOAP條目可能建立一個(gè)SOAP Header條目用來(lái)強(qiáng)制按詞匯的順序執(zhí)行其他的SOAP Header條目。如果沒(méi)有這樣一個(gè)SOAP條目,處理的順序是由SOAP結(jié)點(diǎn)來(lái)判斷的。當(dāng)處理一個(gè)SOAP條目的時(shí)候,SOAP結(jié)點(diǎn)可以引用SOAP envelope中的任何信息。例如如果需要,一個(gè)緩存函數(shù)可以緩存整個(gè)SOAP消息。
如果SOAP結(jié)點(diǎn)是一個(gè)SOAP中介,SOAP消息的式樣和處理的結(jié)果(如果沒(méi)有產(chǎn)生錯(cuò)誤)可以要求進(jìn)一步沿著SOAP消息路徑送遞SOAP消息。這種接力轉(zhuǎn)遞必須以同樣順序包括從SOAP消息源來(lái)的所有的SOAP Header條目和SOAP Body條目,除了那些指向SOAP中介的SOAP Header條目,這些條目必須被移去(無(wú)論他們是否被處理,這些SOAP條目都將被移去)。附加的SOAP Header條目可以被插入在SOAP消息的任何一點(diǎn),這樣被插入的SOAP Herder條目可能沒(méi)法和剛剛被移走的一個(gè)或多個(gè)條目區(qū)分開(kāi)來(lái)(實(shí)際上是會(huì)將他們保留,但強(qiáng)調(diào)需要沿著SOAP消息路徑重新解釋每個(gè)SOAP結(jié)點(diǎn))
3. 與XML的關(guān)系
所有的SOAP消息都是使用XML格式來(lái)編碼的(可參閱[7]以獲得更多的XML的信息)。
SOAP應(yīng)用程序在生成由SOAP定義的所有元素和屬性的時(shí)候,應(yīng)該包含恰當(dāng)?shù)腟OAP命名空間。SOAP應(yīng)用程序必須能處理其收到的消息中的SOAP命名空間。它必須丟棄那些包含不正確命名空間(參閱 section 4.4)的消息,并且可以處理那些不包含SOAP命名空間的SOAP消息,就好象他們包含了正確的命名空間一樣。
SOAP定義了以下的命名空間 (可參閱[8]以獲得更多的XML命名空間的信息):
SOAP信封的命名空間標(biāo)識(shí)為 "http://www.w3.org/2001/06/soap-envelope"
SOAP遍序的命名空間標(biāo)識(shí)為 "http://www.w3.org/2001/06/soap-encoding"
SOAP mustUnderstand fault的命名空間標(biāo)識(shí)為 "http://www.w3.org/2001/06/soap-faults"
SOAP upgrade的命名空間標(biāo)識(shí)為 "http://www.w3.org/2001/06/soap-upgrade"
而這些命名空間的模式文檔可以通過(guò)解析這些命名空間標(biāo)識(shí)符來(lái)獲得。
SOAP消息必須不包含DTD,同時(shí)SOAP消息也必須不包含PI(Processing Instructions)。 [7]
SOAP使用局部的非限制的ID類(lèi)型的id屬性來(lái)指定編碼元素(encoded element)的唯一標(biāo)識(shí),使用局部的非限制的uri-reference類(lèi)型的href屬性來(lái)指定編碼元素的值的應(yīng)用,以獲得與XML規(guī)范[7]、XML Schema規(guī)范[11]和XML Linking Language規(guī)范[9]的一致。
除SOAP mustUnderstand屬性(參閱 section 4.2.3)和SOAP actor屬性(參閱 section 4.2.2)外,一般允許屬性及屬性值自由地選擇是在XML實(shí)例中描述還是在XML Schema中描述,當(dāng)然前提是他們具有相同的效果。也就是說(shuō),在DTD或模式(schema)中使用默認(rèn)值或固定值定義在語(yǔ)義上等價(jià)于在實(shí)例中的定義。
4. SOAP信封
SOAP消息是由一個(gè)強(qiáng)制的SOAP Envelope、一個(gè)可選的SOAP Header和一個(gè)強(qiáng)制的SOAP Body組成的XML文檔。作為SOAP消息的該XML文檔將在本規(guī)范的其余部分被引用。而本節(jié)的元素和屬性的命名空間標(biāo)識(shí)是"http://www.w3.org/2001/06/soap-envelope"。SOAP消息應(yīng)當(dāng)包含如下部分:
一個(gè)SOAP envelope。Envelope是表示該消息的XML文檔的頂級(jí)元素。
一個(gè)SOAP Header。Header則是為了支持在松散環(huán)境下在通訊方(可能是SOAP發(fā)送者、SOAP接受者或者是一個(gè)或多個(gè)SOAP的傳輸中介)之間尚未預(yù)先達(dá)成一致的情況下為SOAP消息增加特性的通用機(jī)制。SOAP定義了很少的一些屬性來(lái)用于指明誰(shuí)可以處理該特性以及它是可選的還是強(qiáng)制的。(參閱 section 4.2)
一個(gè)SOAP Body。Body為該消息的最終接收者所想要得到的那些強(qiáng)制信息提供了一個(gè)容器(參閱 section 4.3)。此外,SOAP定義了Body的一個(gè)子元素Fault用于報(bào)告錯(cuò)誤。
語(yǔ)法規(guī)則如下:
SOAP Envelope
元素名為"Envelope"。
該元素必須在SOAP消息中出現(xiàn)。
該元素可以包含命名空間申明和額外的屬性。如果出現(xiàn)額外屬性,則必須有命名空間修飾。類(lèi)似的,該元素可以包含額外的子元素,這些子元素如果出現(xiàn),必須有命名空間修飾并且必須跟在SOAP Body元素之后。
SOAP Header (參閱 section 4.2)
元素名為"Header"。
該元素可以在SOAP消息中出現(xiàn)。如果出現(xiàn),該元素必須是SOAP Envelope元素的第一個(gè)直接子元素。
該元素可以包含一系列的Header條目,這些條目都應(yīng)當(dāng)是Header元素的直接子元素。Header的所有直接子元素必須有命名空間修飾。
SOAP Body (參閱 section 4.3)
元素名為"Body"。
該元素必須在SOAP消息中出現(xiàn),同時(shí)必須是SOAP Envelope元素的一個(gè)直接子元素。若該消息中包含Header元素,則Body元素必須直接跟隨Header,為Header元素的相鄰兄弟元素。若Header不出現(xiàn),則其必須是Envelope的第一個(gè)直接子元素。
該元素可以包含一系列的Body條目,這些條目都應(yīng)當(dāng)是Body元素的直接子元素。Body的所有直接子元素必須有命名空間修飾。SOAP定義了SOAP Fault元素,它用來(lái)指示錯(cuò)誤消息。(參閱 section 4.4).
4.1.1 SOAP encodingStyle屬性
SOAP的全局encodingStyle屬性被用于指明在SOAP消息中使用哪種編序規(guī)則。該屬性可以在任意元素中出現(xiàn),并且其作用范圍包括該元素的內(nèi)容和所有其子元素中未使用該屬性的所有子元素,這就象XML命名空間定義的作用范圍。對(duì)于一個(gè)SOAP消息來(lái)說(shuō),沒(méi)有默認(rèn)的編碼定義。
該屬性的值是一個(gè)或多個(gè)用于標(biāo)識(shí)編序規(guī)則和用于標(biāo)識(shí)解序SOAP消息的規(guī)則的有序列表,其排序是按照詳盡程度從大到小排列。Example 3展示了encodingStyle屬性的三個(gè)例子:
Example 3
encodingStyle="http://www.w3.org/2001/06/soap-encoding"encodingStyle="http://example.org/encoding/restricted http://example.org/encoding/"encodingStyle=""
Example values for the encodingStyle attribute
在section 5中定義的編序規(guī)則的標(biāo)識(shí)為"http://www.w3.org/2001/06/soap-encoding"。消息若要使用特別的編序應(yīng)該使用SOAP encodingStyle屬性來(lái)指明。另外,所有在句法上由"http://www.w3.org/2001/06/soap-encoding"開(kāi)始的URI序列表明這其中包含的所有URI都與section 5中定義的SOAP編碼規(guī)則相一致。(雖然可能會(huì)添加潛在的更為嚴(yán)格的規(guī)則)
一個(gè)空值的URI(“”)明確地指明并未為其所包含的元素聲明任何編碼風(fēng)格。這可以為包含的元素關(guān)閉任何聲明。
4.1.2 Envelope版本模型
SOAP并未定義一個(gè)傳統(tǒng)的基于主輔版本號(hào)的版本模型。SOAP消息必須包含一個(gè)與命名空間"http://www.w3.org/2001/06/soap-envelope"相關(guān)聯(lián)的Envelope元素。如果SOAP應(yīng)用程序收到一個(gè)SOAP消息,這個(gè)消息中的Envelope元素與一個(gè)與"http://www.w3.org/2001/06/soap-envelope"不同的命名空間相關(guān)聯(lián),則該應(yīng)用程序必須視其為一個(gè)版本錯(cuò)誤并生成一個(gè)VersionMismatch SOAP錯(cuò)誤。SOAP VersionMismatch錯(cuò)誤消息必須使用SOAP 1.1的信封命名空間"http://schemas.xmlsoap.org/soap/envelope/"(參閱 Appendix C)修飾。
4.2 SOAP Header
SOAP提供了一個(gè)可伸縮的機(jī)制用于在分散的模塊化的環(huán)境下擴(kuò)展SOAP消息,而通訊雙方并不需要有預(yù)先的約定知識(shí)。典型的擴(kuò)展例子可以是實(shí)現(xiàn)一些諸如認(rèn)證、事務(wù)管理以及支付的Header條目。
SOAP Header元素應(yīng)當(dāng)被編碼為SOAP Envelope XML文檔的第一直接子元素。Header的所有直接子元素都被稱為Header條目。
Header條目的編碼規(guī)則包括:
一個(gè)SOAP Header條目由一個(gè)完整修飾的元素名來(lái)標(biāo)識(shí),所謂完整修飾的元素名是由一個(gè)命名空間URI和局部名來(lái)組成。SOAP Header元素的所有直接子元素都必須是完整修飾的。
SOAP encodingStyle屬性可以用于指明Header條目的編碼風(fēng)格(參閱 section 4.1.1)。
SOAP actor屬性(參閱 section 4.2.2)和SOAP mustUnderstand屬性(參閱 section 4.2.3)可以用于指明由哪個(gè)SOAP結(jié)點(diǎn)來(lái)處理?xiàng)l目以及如何處理?xiàng)l目。
4.2.1 使用Header屬性
本節(jié)中定義的SOAP Header屬性決定了SOAP消息的接收者應(yīng)該如何處理消息(參閱 section 2)。一個(gè)生成SOAP消息的SOAP應(yīng)用程序應(yīng)該僅使用SOAP Header元素的直接子元素的SOAP Header屬性。而對(duì)于那些并非作為SOAP Header元素的直接子元素出現(xiàn)的SOAP Header屬性,SOAP消息的接受者必須忽略。
以下是一個(gè)SOAP Header的例子(Example 4),其中包含了一個(gè)元素標(biāo)識(shí)Transaction和一個(gè)mustUnderstand屬性及其值1,以及Transactin的值5:
Example 4
<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>
Example header with a single header block
4.2.2 SOAP actor屬性
EdNote: This section partially overlaps with section 2. We expect this to be reconciled in a future revision of the specification.
SOAP消息從生成者到達(dá)最終接受者,將潛在地沿著消息路徑(message path)經(jīng)過(guò)一系列的SOAP中間介。SOAP中間介是一個(gè)能夠接受和轉(zhuǎn)發(fā)SOAP消息的應(yīng)用程序。所有的中間介都如同最終接受者一樣由一個(gè)URI來(lái)標(biāo)識(shí)。
并非一個(gè)SOAP消息的所有部分都是最終接收者想要的,其中部分是路徑中的一個(gè)或多個(gè)中間介所需要的。Header元素中接收者角色類(lèi)似和約的接受者,他并不能將其交給其它方。也就是說(shuō),一個(gè)接收者接到其想要的一個(gè)Header元素必須不轉(zhuǎn)發(fā)該Header給SOAP消息路徑中的下一個(gè)應(yīng)用程序,因?yàn)楹霞s關(guān)系是存在于前二者之間的。該接收者可以插入一個(gè)類(lèi)似的Header元素,但在這個(gè)情況下,和約關(guān)系存在于該應(yīng)用程序及下一個(gè)Header元素的接收者之間了。
SOAP actor全局屬性可以被用于指明Header元素的接收者。而SOAP actor屬性的值是一個(gè)URI。這個(gè)特別的URI"http://www.w3.org/2001/06/soap-envelope/actor/next"指明該Header元素是直接的下一個(gè)進(jìn)行消息處理的SOAP應(yīng)用程序想要的。這與HTTP的連接頭字段的hop-by-hop scope model的表示。
若省略SOAP actor屬性,則表明接收者是SOAP消息的最終接收者。
這個(gè)屬性必須出現(xiàn)在SOAP消息的實(shí)例中,而不能定義在相關(guān)的XML Schema中以期獲得同樣效果(參閱 section 3 和section 4.2.1)。
4.2.3 SOAP mustUnderstand屬性
EdNote: This section partially overlaps with section 2. We expect this to be reconciled in a future revision of the specification.
SOAP mustUnderstand全局屬性用于指明一個(gè)Header條目是強(qiáng)制的還是可選的要求接收者處理。Header條目的接收結(jié)點(diǎn)由SOAP actor屬性來(lái)定義(參閱 section 4.2.2)。mustUnderstand屬性的值可為“0”或“1”。若沒(méi)有使用SOAP mustUnderstand屬性,則在語(yǔ)義上等價(jià)于mustUderstand屬性出現(xiàn)同時(shí)取值為“0”,也就是說(shuō)這個(gè)條目是可選的。
若Header條目帶有值為“1”的SOAP mustUnderstand屬性,則該Header條目的接收結(jié)點(diǎn)要么必須遵循語(yǔ)義(由具備完整修飾的元素名來(lái)傳達(dá))并正確地處理這些語(yǔ)義,要么必須宣稱處理消息失敗(參閱 section 4.4)。
SOAP mustUnderstand屬性是為了考慮健壯地升級(jí)而設(shè)置的。所有用值為“1”的SOAP mustUnderstand屬性來(lái)標(biāo)記的元素必須被認(rèn)為是可以影響該元素的上級(jí)元素或同級(jí)元素的語(yǔ)義。而這種風(fēng)格標(biāo)記的元素應(yīng)保證對(duì)語(yǔ)義的修改并不能被那些不能完全理解該修改后的語(yǔ)義的那些元素靜默地或假設(shè)地、不正確地忽略。
該屬性若要生效必須在實(shí)例中出現(xiàn),而不能定義在相關(guān)的XML Schema中以期獲得同樣效果(參閱 section 3 和section 4.2.1)。
4.3 SOAP Body
SOAP Body元素提供一個(gè)簡(jiǎn)單的用于與消息的最終接收者交換強(qiáng)制信息的機(jī)制。而B(niǎo)ody元素的典型應(yīng)用包含序列的RPC調(diào)用和錯(cuò)誤報(bào)告。
Body元素在編碼上應(yīng)當(dāng)作為SOAP Envelope元素的一個(gè)直接子元素。如果包含Header元素,則Body元素必須直接跟隨Header元素,為Header元素的直接下一個(gè)兄弟元素,否則Body元素必須是Envelope元素的第一直接子元素。
所有Body元素的直接子元素被成為SOAP Body條目,同時(shí)每一個(gè)Body條目都應(yīng)當(dāng)編碼為SOAP Body元素里的一個(gè)獨(dú)立元素。
Body條目的編碼規(guī)則包括:
一個(gè)Body條目由一個(gè)完整修飾的元素名來(lái)標(biāo)識(shí),所謂完整修飾的元素名是由一個(gè)命名空間URI和局部名來(lái)組成。SOAP Body元素的直接子元素可以是命名空間修飾的。
SOAP encodingStyle屬性可以被用來(lái)表明Body條目中使用的編碼規(guī)則(參閱 section 4.1.1)。
SOAP定義了一個(gè)Body條目,用于報(bào)告錯(cuò)誤的Fault條目(參閱 section 4.4)。
4.3.1 SOAP Header和Body的關(guān)系
Header和Body在定義上是獨(dú)立的,但在事實(shí)上是相聯(lián)系的。一個(gè)Body條目和一個(gè)Header條目的關(guān)系是:一個(gè)Body條目在語(yǔ)義上與這樣一個(gè)Header條目等價(jià),該Header條目將由默認(rèn)參與者(最終接受者)解釋同時(shí)由值為“1”的SOAP mustUnderstand屬性標(biāo)記。默認(rèn)參與者可以使用actor屬性缺失的方式來(lái)指明(參閱 section 4.2.2)。
4.4 SOAP錯(cuò)誤
SOAP Fault元素是用于在SOAP消息中傳輸錯(cuò)誤或狀態(tài)信息。如果SOAP消息需要包含SOAP Fault元素的話,它必須作為一個(gè)Body條目出現(xiàn),同時(shí)在Body元素內(nèi)它必須不出現(xiàn)多于一次(至多出現(xiàn)一次)。
SOAP Fault元素定義了如下子元素:
faultcode
faultcode元素是應(yīng)那些要提供一個(gè)算法上的機(jī)制來(lái)標(biāo)識(shí)錯(cuò)誤的軟件的需要。faultcode必須在SOAP Fault元素中出現(xiàn),同時(shí)faultcode的值必須是如[8]中的第3節(jié)中定義的一個(gè)修飾(限制)名。SOAP定義了一個(gè)很小的SOAP錯(cuò)誤代碼的集合用于覆蓋基本的SOAP錯(cuò)誤(參閱 section 4.4.1)。
faultstring
faultstring元素是為那些錯(cuò)誤代碼提供一個(gè)人可以讀懂的錯(cuò)誤解釋,它不是為程序處理而設(shè)。Faultstring元素有點(diǎn)類(lèi)似于HTTP中定義的’Reason-Phrase’(參閱 [5], section 6.1)。faultstring必須在SOAP Fault元素中出現(xiàn),同時(shí)它至少應(yīng)該提供一些解釋該錯(cuò)誤種類(lèi)的信息。
faultactor
faultactor元素是為在SOAP消息路徑(參閱 section 2)中是誰(shuí)引起了該錯(cuò)誤的發(fā)生這一情況描述信息。它類(lèi)似于SOAP actor屬性(參閱 section 4.2.2),不過(guò)它不是用于指示Header條目的接收者,而是用于指示錯(cuò)誤源。faultactor屬性的值是一個(gè)標(biāo)識(shí)該源的一個(gè)URI。所謂并非作為SOAP消息最終接收者的應(yīng)用程序必須在SOAP Fault元素中包含faultactor元素。而消息的最終接收者可以使用faultactor元素來(lái)明確地指明是它生成了該錯(cuò)誤(參閱下面的detail元素]。
detail
detail元素是用于傳輸與SOAP Body元素相關(guān)的應(yīng)用程序特別的錯(cuò)誤信息。如果Body元素中的內(nèi)容不能被成功地處理的時(shí)候,它必須出現(xiàn)。它必須不能被用于傳輸屬于Header條目的錯(cuò)誤信息。詳細(xì)的屬于Header條目的錯(cuò)誤信息必須在Header條目中表示傳輸,如果需要例子的話,請(qǐng)參閱section 4.4.2。
若SOAP Fault元素中不出現(xiàn)detail元素則表明其中的錯(cuò)誤與Body元素的處理無(wú)關(guān)。這可以用于區(qū)分在錯(cuò)誤情況下Body元素是否被SOAP的最終接受者處理過(guò)。
detail元素的所有直接子元素都被稱為detail條目,同時(shí)每個(gè)detail條目都作為detail元素中的一個(gè)獨(dú)立的元素進(jìn)行編碼。
Detail條目的編碼規(guī)則如下(也可以參閱 example 10):
一個(gè)detail條目由一個(gè)完整修飾的元素名來(lái)標(biāo)識(shí),所謂完整修飾的元素名是由一個(gè)命名空間URI和局部名來(lái)組成。Detail元素的直接子元素可以是命名空間修飾的。
SOAP encodingStyle屬性可以被用來(lái)表明detail條目中使用的編碼規(guī)則(參閱 section 4.1.1)。
4.4.1 SOAP錯(cuò)誤代碼
當(dāng)描述由本規(guī)范定義的錯(cuò)誤的時(shí)候,faultcode元素必須使用在本節(jié)中定義的faultode的值。這些faultcode值的命名空間標(biāo)識(shí)為"http://www.w3.org/2001/06/soap-envelope"。在現(xiàn)有規(guī)范之外定義的方法的規(guī)范推薦使用該命名空間(但不是必須的)。
默認(rèn)的SOAP faultcode值是按照一種可擴(kuò)展的風(fēng)格來(lái)定義的,它允許在維持已有的faultcode值的向后兼容的基礎(chǔ)定義新的SOAP faultcode值。這一機(jī)制在使用上非常類(lèi)似與HTTP中基本狀態(tài)類(lèi)的定義1xx, 2xx, 3xx等(參閱[5]中的section 10)。不過(guò),他們是用XML修飾名來(lái)定義(參閱[8]中的section 3),而不是用整數(shù)。“.”符號(hào)是faultcode值的分隔符,用于指明“.”左邊的是一個(gè)比右邊更泛化的錯(cuò)誤代碼。Example 5顯示了這一特性:
Example 5
Client.Authentication
Example of an authentication fault code
在SOAP中定義的faultcode值集合被羅列在下表。
Name
Meaning
VersionMismatch
處理程序發(fā)現(xiàn)在SOAP Envelope元素中有一個(gè)非法的命名空間。(參閱 section 4.1.2)
MustUnderstand
SOAP Header元素的一個(gè)直接子元素?zé)o法被理解或者他并不遵守由處理對(duì)象要求的SOAP mustUnderstand屬性必須取值為“1”的要求。(參閱 section 4.2.3)
Client
Client錯(cuò)誤類(lèi)用于指示以下錯(cuò)誤:消息的格式有誤或消息中缺乏能成功處理所必須的一些適當(dāng)信息。例如,消息中可能缺乏適當(dāng)?shù)恼J(rèn)證和支付信息。一般情況下應(yīng)指明消息不應(yīng)該在沒(méi)有修改過(guò)的情況下重發(fā)??蓞㈤唖ection 4.4來(lái)參閱Fault detail子元素的描述。
Server
Server錯(cuò)誤類(lèi)用于表明消息無(wú)法被處理的原因,但那些屬于內(nèi)容上的錯(cuò)誤并不屬于該范疇,它主要被用于指示那些屬于處理上的錯(cuò)誤。例如,處理操作需要包含與一個(gè)上游處理程序進(jìn)行通訊,但該程序沒(méi)有響應(yīng)。但該消息可能在下一個(gè)時(shí)間點(diǎn)上被成功處理??蓞㈤唖ection 4.4來(lái)參閱Fault detail子元素的描述。
4.4.2 MustUnderstand錯(cuò)誤
當(dāng)SOAP結(jié)點(diǎn)產(chǎn)生一個(gè)MustUnderstand錯(cuò)誤時(shí),它應(yīng)該在產(chǎn)生出的出錯(cuò)消息中按照下面描述的的方式提供相應(yīng)的Header條目。在產(chǎn)生的錯(cuò)誤消息中,它應(yīng)該提供Header條目來(lái)描述不能被理解的帶修辭的名的細(xì)節(jié)(Qnames,由XML Schema數(shù)據(jù)類(lèi)型說(shuō)明)。
每個(gè)這樣的Header條目有個(gè)本地的名字為Misunderstood以及一個(gè)叫"http://www.w3.org/2001/06/soap-faults"的命名空間。每個(gè)塊都有一個(gè)名為qname的不帶修飾的屬性,它的值為出錯(cuò)結(jié)點(diǎn)所不能理解的Header條目的Qname。
舉例來(lái)說(shuō),如果最初消息的容器不能理解Example 6中的兩個(gè)Header元素abc:Extension1和def:Extension2,則會(huì)產(chǎn)生出錯(cuò)消息,該消息顯示在Example 7中。
Example 6
<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>
SOAP envelope that will cause a SOAP MustUnderstand fault if Extension1 or Extension2 are not understood
Example 7
<env:Envelope xmlns:env='http://www.w3.org/2001/06/soap-envelope' xmlns:f='http://www.w3.org/2001/06/soap-faults' > <env:Header> <f:Misunderstood qname='abc:Extension1' xmlns:abc='http://example.org/2001/06/ext' /> <f:Misunderstood qname='def:Extension2' xmlns:def='http://example.com/stuff' /> </env:Header> <env:Body> <env:Fault> <faultcode>MustUnderstand</faultcode> <faultstring>One or more mandatory headers not understood</faultstring> </env:Fault> </env:Body></env:Envelope>
SOAP fault generated as a result of not understanding Extension1 and Extension2 in Example 6
注意到這里不需要命名空間前綴返回與源Header元素命名空間相匹配的qname,倘若前綴映射到一個(gè)相同的命名空間名,則錯(cuò)誤結(jié)點(diǎn)可使用任意前綴。
還注意到這里沒(méi)有保證每個(gè)Mustunderstand錯(cuò)誤都包含所有的Misunderstood Header 的Qname,SOAP結(jié)點(diǎn)可以在第一個(gè)Header塊產(chǎn)生一個(gè)只包含單個(gè)Header塊錯(cuò)誤細(xì)節(jié)信息之后再產(chǎn)生一個(gè)錯(cuò)誤。SOAP結(jié)點(diǎn)也可以產(chǎn)生一個(gè)一次包含所有MustUnderstand問(wèn)題細(xì)節(jié)的混合錯(cuò)誤。