SOAP:簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (2001-1-1) 摘要 SOAP是用在分散或分布的環(huán)境中交換信息的簡(jiǎn)單的協(xié)議,它是一個(gè)基于XML的協(xié)議,包括三個(gè)部分:封裝定義了一個(gè)描述消息中包含什么內(nèi)容以及如何處理它們的框架,編碼規(guī)則用于表示應(yīng)用程序定義的數(shù)據(jù)類型的實(shí)例,另外還有一個(gè)表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定。SOAP被設(shè)計(jì)為可以與各種其它協(xié)議結(jié)合使用;但這篇文章僅描述如何將SOAP和HTTP及HTTP擴(kuò)展框架相結(jié)合。
目錄 1. 簡(jiǎn)介 1.1 設(shè)計(jì)目標(biāo) 1.2 符號(hào)協(xié)定 1.3 SOAP消息舉例 2. SOAP消息交換模型 3. 與XML的關(guān)系 4. SOAP封裝 4.1.1 SOAP encodingStyle屬性 4.1.2 封裝版本模型 4.2 SOAP頭 4.2.1 使用SOAP頭屬性 4.2.2 SOAP actor屬性 4.2.3 SOAP mustUnderstand屬性 4.3 SOAP體 4.3.1 SOAP頭和體的關(guān)系 4.4 SOAP 錯(cuò)誤 4.4.1 SOAP錯(cuò)誤代碼 5. SOAP編碼 5.1 XML編碼類型規(guī)則 5.2 簡(jiǎn)單類型 5.2.1 字符串 5.2.2 枚舉 5.2.3 字符數(shù)組 5.3 多態(tài) Accessor 5.4 復(fù)合類型 5.4.1 復(fù)合值和對(duì)值的引用 5.4.2 數(shù)組 5.4.2.1 PartiallyTransmitted Arrays 5.4.2.2 稀疏數(shù)組 5.4.3 一般復(fù)合類型 5.5 缺省值 5.6 SOAP root屬性 6. 在HTTP中使用SOAP 6.1 SOAP HTTP請(qǐng)求 6.1.1 HTTP頭中的SOAPAction域 6.2 SOAP HTTP應(yīng)答 6.3 HTTP擴(kuò)展框架 6.4 SOAP HTTP舉例 7. 用SOAP表示RPC 7.1 RPC和SOAP體 7.2 RPC和SOAP頭 8. 安全考慮 9. 參考文獻(xiàn) A. SOAP封裝舉例 A.1 請(qǐng)求編碼舉例 A.2 應(yīng)答編碼舉例 1. 簡(jiǎn)介 SOAP以XML形式提供了一個(gè)簡(jiǎn)單、輕量的用于在分散或分布環(huán)境中交換結(jié)構(gòu)化和類型化信息的機(jī)制。SOAP本身并沒(méi)有定義任何應(yīng)用程序語(yǔ)義,如編程模型或特定語(yǔ)義的實(shí)現(xiàn);實(shí)際上它通過(guò)提供一個(gè)有標(biāo)準(zhǔn)組件的包模型和在模塊中編碼數(shù)據(jù)的機(jī)制,定義了一個(gè)簡(jiǎn)單的表示應(yīng)用程序語(yǔ)義的機(jī)制。這使SOAP能夠被用于從消息傳遞到RPC的各種系統(tǒng)。
SOAP包括三個(gè)部分
SOAP封裝(見(jiàn)第4節(jié))結(jié)構(gòu)定義了一個(gè)整體框架用來(lái)表示消息中包含什么內(nèi)容,誰(shuí)來(lái)處理這些內(nèi)容以及這些內(nèi)容是可選的或是必需的。 SOAP編碼規(guī)則(見(jiàn)第5節(jié))定義了用以交換應(yīng)用程序定義的數(shù)據(jù)類型的實(shí)例的一系列機(jī)制。 SOAP RPC表示(見(jiàn)第7節(jié))定義了一個(gè)用來(lái)表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定。 雖然這三個(gè)部分都作為SOAP的一部分一起描述,但它們?cè)诠δ苌鲜窍嘟坏摹L貏e的,封裝和編碼規(guī)則是在不同的名域中定義的,這種模塊性的定義方法增加了簡(jiǎn)單性。
在SOAP封裝,SOAP編碼規(guī)則和SOAP RPC協(xié)定之外,這個(gè)規(guī)范還定義了兩個(gè)協(xié)議的綁定,描述了在有或沒(méi)有HTTP擴(kuò)展框架[6]的情況下,SOAP消息如何包含在HTTP消息[5]中被傳送。
1.1 設(shè)計(jì)目標(biāo) SOAP的主要設(shè)計(jì)目標(biāo)是簡(jiǎn)單性和可擴(kuò)展性,這意味著傳統(tǒng)的消息系統(tǒng)和分布對(duì)象系統(tǒng)的某些性質(zhì)不是SOAP規(guī)范的一部分。這些性質(zhì)包括:
分布式碎片收集 成批傳送消息 對(duì)象引用(要求分布式碎片收集) 激活機(jī)制(要求對(duì)象引用) 1.2 符號(hào)約定 這篇文章中的關(guān)鍵字 "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/"關(guān)聯(lián)。
整篇文檔中,名域前綴“xsi”被假定為與URI "http://www.w3.org/1999/XMLSchema-instance“(在XML Schema規(guī)范[11]定義)相連。類似的,名域前綴”xsd“被假定為與URI "http://www.w3.org/1999/XMLSchema"(在 [10]中定義)相連。名域前綴”tns“用來(lái)表示任意名域。所有其它的名域前綴都只是例子。
名域URI的基本形式”some-URI“表示某些依賴于應(yīng)用程序或上下文的URI[4]。
這個(gè)規(guī)范用擴(kuò)展BNF(在RFC-2616[5] 描述)描述某些結(jié)構(gòu)。
1.3 SOAP消息舉例 在這個(gè)例子中,GetLastTradePrice SOAP 請(qǐng)求被發(fā)往 StockQuote服務(wù)。這個(gè)請(qǐng)求攜帶一個(gè)字符串參數(shù)和ticker符號(hào),在SOAP應(yīng)答中返回一個(gè)浮點(diǎn)數(shù)。XML名域用來(lái)區(qū)分SOAP標(biāo)志符和應(yīng)用程序特定的標(biāo)志符。這個(gè)例子說(shuō)明了在第6節(jié)中定義的HTTP綁定。如果SOAP中管理XML負(fù)載的規(guī)則完全獨(dú)立于HTTP是沒(méi)有意義的,因?yàn)槭聦?shí)上該負(fù)載是由HTTP攜帶的。
在Appendix A中有更多的例子。
例1 在HTTP請(qǐng)求中嵌入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>
下面是一條應(yīng)答消息,包括HTTP消息,SOAP消息是其具體內(nèi)容:
例2 在HTTP應(yīng)答中嵌入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消息從發(fā)送方到接收方是單向傳送,但正如上面顯示的,SOAP消息經(jīng)常以請(qǐng)求/應(yīng)答的方式實(shí)現(xiàn)。
SOAP實(shí)現(xiàn)可以通過(guò)開(kāi)發(fā)特定網(wǎng)絡(luò)系統(tǒng)的特性來(lái)優(yōu)化。例如,HTTP綁定(見(jiàn)第6節(jié))使SOAP應(yīng)答消息以HTTP應(yīng)答的方式傳輸,并使用同一個(gè)連接返回請(qǐng)求。
不管SOAP被綁定到哪個(gè)協(xié)議,SOAP消息采用所謂的”消息路徑“發(fā)送,這使在終節(jié)點(diǎn)之外的中間節(jié)點(diǎn)可以處理消息。
一個(gè)接收SOAP消息的SOAP應(yīng)用程序必須按順序執(zhí)行以下的動(dòng)作來(lái)處理消息:
識(shí)別應(yīng)用程序想要的SOAP消息的所有部分 (見(jiàn)4.2.2節(jié)) 檢驗(yàn)應(yīng)用程序是否支持第一步中識(shí)別的消息中所有必需部分并處理它。如果不支持,則丟棄消息(見(jiàn)4.4節(jié))。在不影響處理結(jié)果的情況下,處理器可能忽略第一步中識(shí)別出的可選部分。 如果這個(gè)SOAP應(yīng)用程序不是這個(gè)消息的最終目的地,則在轉(zhuǎn)發(fā)消息之前刪除第一步中識(shí)別出來(lái)的所有部分。 為了正確處理一條消息或者消息的一部分,SOAP處理器需要理解:所用的交換方式(單向,請(qǐng)求/應(yīng)答,多路發(fā)送等等),這種方式下接收者的任務(wù),RPC機(jī)制(如果有的話)的使用(如第7節(jié)中所述),數(shù)據(jù)的表現(xiàn)方法或編碼,還有其它必需的語(yǔ)義。
盡管屬性比如SOAP encodingstyle(見(jiàn)4.1.1節(jié))可以用于描述一個(gè)消息的某些方面,但這個(gè)規(guī)范并不強(qiáng)制所有的接收方也必須有同樣的屬性并取同樣的屬性值。舉個(gè)例子,某一特定的應(yīng)用可能知道一個(gè)元素表示一條遵循第7節(jié)約定的RPC請(qǐng)求,但是另外一些應(yīng)用可能認(rèn)為指向該元素的所有消息都用單向傳輸,而不是類似第7節(jié)的請(qǐng)求應(yīng)答模式。 (譯者注:交互雙方的SOAP消息并不一定要遵循同樣的格式設(shè)定,而只需要以一種雙方可理解的格式交換信息就可以了)
3. 與XML的關(guān)系 所有的SOAP消息都使用XML形式編碼(更多有關(guān)XML的信息請(qǐng)見(jiàn)[7])
一個(gè)SOAP應(yīng)用程序產(chǎn)生的消息中,所有由SOAP定義的元素和屬性中必須包括正確的名域。SOAP應(yīng)用程序必須能夠處理它接收到的消息中的SOAP名域(見(jiàn)4.4節(jié)),并且它可以處理沒(méi)有SOAP名域的SOAP消息,就象它們有正確的名域一樣。
SOAP定義了兩個(gè)名域(更多有關(guān)XML名域的信息請(qǐng)見(jiàn)[8])
SOAP封裝的名域標(biāo)志符是"http://schemas.xmlsoap.org/soap/envelope/" SOAP的編碼規(guī)則的名域標(biāo)志符是"http://schemas.xmlsoap.org/soap/encoding/" SOAP消息中不能包含文檔類型聲明,也不能包括消息處理指令。[7]
SOAP使用"ID"類型"id"屬性來(lái)指定一個(gè)元素的唯一的標(biāo)志符,同時(shí)該屬性是局部的和無(wú)需校驗(yàn)的。SOAP使用"uri-reference"類型的"href"屬性指定對(duì)這個(gè)值的引用,同時(shí)該屬性是局部的和無(wú)需校驗(yàn)的。這樣就遵從了XML規(guī)范[7],XML Schema規(guī)范[11]和XML連接語(yǔ)言規(guī)范[9]的風(fēng)格。
除了SOAP mustUnderstand 屬性(見(jiàn)4.2.3節(jié))和SOAP actor屬性(見(jiàn)4.2.2節(jié))之外,一般允許屬性和它們的值出現(xiàn)在XML文檔實(shí)例或Schema中(兩者效果相同)。也就是說(shuō),在DTD或Schema中聲明一個(gè)缺省值或固定值和在XML文檔實(shí)例中設(shè)置它的值在語(yǔ)義上相同。
4. SOAP封裝 SOAP消息是一個(gè)XML文檔,包括一個(gè)必需的SOAP封裝,一個(gè)可選的SOAP頭和一個(gè)必需的SOAP體。在這篇規(guī)范剩余部分中,提到SOAP消息時(shí)就是指這個(gè)XML文檔。這一節(jié)中定義的元素和屬性的名域標(biāo)志符為:"http://schemas.xmlsoap.org/soap/envelope/" 。一個(gè)SOAP消息包括以下部分:
在表示這個(gè)消息的XML文檔中,封裝是頂層元素。 應(yīng)用SOAP交換信息的各方是分散的且沒(méi)有預(yù)先協(xié)定,SOAP頭提供了向SOAP消息中添加關(guān)于這條SOAP消息的某些要素(feature)的機(jī)制。SOAP定義了少量的屬性用來(lái)表明這項(xiàng)要素(feature)是否可選以及由誰(shuí)來(lái)處理。(見(jiàn)4.2節(jié)) SOAP體是包含消息的最終接收者想要的信息的容器(見(jiàn)4.3節(jié))。SOAP為SOAP體定義了一個(gè)Fault元素用來(lái)報(bào)告錯(cuò)誤信息。 語(yǔ)法規(guī)則如下所示:
封裝 元素名是 "Envelope" 在SOAP消息中必須出現(xiàn)。 可以包含名域聲明和附加屬性。如果包含附加屬性,這些屬性必須限定名域。類似的,"Envelope"可以包含附加子元素,這些也必須限定名域且跟在SOAP體元素之后。 SOAP頭 (見(jiàn)4.2節(jié)) 元素名是"Header" 在SOAP消息中可能出現(xiàn)。如果出現(xiàn)的話,必須是SOAP 封裝元素的第一個(gè)直接子元素。 SOAP頭可以包含多個(gè)條目,每個(gè)都是SOAP頭元素的直接子元素。所有SOAP頭的直接子元素都必須限定名域。 SOAP體 (見(jiàn)4.3節(jié)) 元素名是"Body" 在SOAP消息中必須出現(xiàn)且必須是SOAP封裝元素的直接子元素。它必須直接跟在SOAP頭元素(如果有的話)之后。否則它必須是SOAP封裝元素的第一個(gè)直接子元素。 SOAP體可以包括多個(gè)條目,每個(gè)條目必須是SOAP體元素的直接子元素。SOAP體元素的直接子元素可以限定名域。SOAP定義了SOAP Fault元素來(lái)表示錯(cuò)誤信息。(見(jiàn)4.4節(jié)). 4.1.1 SOAP encodingStyle 屬性 EncodingStyle全局屬性用來(lái)表示SOAP消息的序列化規(guī)則。這個(gè)屬性可以在任何元素中出現(xiàn),作用范圍與名域聲明的作用范圍很相似,為這個(gè)元素的內(nèi)容和它的所有沒(méi)有重載此屬性的子元素。SOAP消息沒(méi)有定義缺省編碼。
屬性值是一個(gè)或多個(gè)URI的順序列表,每個(gè)URI確定了一種或多種序列化規(guī)則,用來(lái)不同程度反序列化SOAP消息,舉例如下:
"http://schemas.xmlsoap.org/soap/encoding/" "http://my.host/encoding/restricted http://my.host/encoding/" ""
第5節(jié)中定義的序列化規(guī)則由URI"http://schemas.xmlsoap.org/soap/encoding/" 確定。使用這個(gè)特定序列化規(guī)則的消息應(yīng)該用encodingStyle屬性說(shuō)明這一點(diǎn)。另外,所有以"http://schemas.xmlsoap.org/soap/encoding/"開(kāi)頭的URI中的序列化規(guī)則與第5節(jié)中定義的SOAP編碼規(guī)則相一致。
一個(gè)零長(zhǎng)度的URI("")明確顯示所含元素沒(méi)有任何編碼形式。這可以用來(lái)取消上一級(jí)元素的所有編碼聲明。
4.1.2 封裝版本模型 SOAP沒(méi)有定義常規(guī)的基于主版本號(hào)和輔版本號(hào)的版本形式。SOAP消息必須有一個(gè)封裝元素與名域"http://schemas.xmlsoap.org/soap/envelope/"關(guān)聯(lián)。如果SOAP應(yīng)用程序接收到的SOAP消息中的SOAP封裝元素與其他的名域關(guān)聯(lián),則視為版本錯(cuò)誤,應(yīng)用程序必須丟棄這個(gè)消息。如果消息是通過(guò)HTTP之類的請(qǐng)求/應(yīng)答協(xié)議收到的,應(yīng)用程序必須回答一個(gè)SOAP VersionMismatch 錯(cuò)誤信息(見(jiàn)4.4節(jié))。
4.2 SOAP頭 SOAP為相互通信的團(tuán)體之間提供了一種很靈活的機(jī)制:在無(wú)須預(yù)先協(xié)定的情況下,以分散但標(biāo)準(zhǔn)的方式擴(kuò)展消息。可以在SOAP頭中添加條目實(shí)現(xiàn)這種擴(kuò)展,典型的例子有認(rèn)證,事務(wù)管理,支付等等。
頭元素編碼為SOAP封裝元素的第一個(gè)直接子元素。頭元素的所有直接子元素稱作條目。
條目的編碼規(guī)則如下:
一個(gè)條目有它的完整的元素名(包括名域URI和局部名)確定。SOAP頭的直接子元素必須有名域限制。 SOAP encodingStyle屬性可以用來(lái)指示條目所用的編碼形式(見(jiàn)4.1.1節(jié)) SOAP mustUnderstand屬性(見(jiàn)4.2.3節(jié))和SOAP actor屬性(見(jiàn)4.2.2節(jié))可以用來(lái)指示如何處理這個(gè)條目以及由誰(shuí)來(lái)處理。(見(jiàn)4.2.1節(jié)) 4.2.1 使用頭屬性 這一節(jié)中定義的SOAP頭屬性確定了SOAP消息的接收者應(yīng)該怎樣按第2節(jié)中所述的方式處理消息。產(chǎn)生SOAP消息的SOAP應(yīng)用程序,應(yīng)該僅僅在SOAP頭元素的直接子元素中使用這些SOAP頭屬性。SOAP消息的接收者必須忽略所有不在SOAP頭元素的直接子元素中SOAP頭屬性。
下面的例子是一個(gè)SOAP頭,包括一個(gè)元素標(biāo)志符"Transaction","mustUnderstand"取值為"1"和數(shù)值5。這應(yīng)該以如下方式編碼:
<SOAP-ENV:Header> <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1"> 5 </t:Transaction> </SOAP-ENV:Header>
4.2.2 SOAP actor屬性 一個(gè)SOAP消息從始節(jié)點(diǎn)到終節(jié)點(diǎn)的過(guò)程中,可能沿著消息路徑經(jīng)過(guò)一系列SOAP中間節(jié)點(diǎn)。一個(gè)SOAP中間節(jié)點(diǎn)是一個(gè)可以接收轉(zhuǎn)發(fā)SOAP消息的應(yīng)用程序。中間節(jié)點(diǎn)和終節(jié)點(diǎn)由URI區(qū)分。
可能SOAP消息的終節(jié)點(diǎn)并不需要所有部分,而在消息路徑上的一個(gè)和幾個(gè)中間節(jié)點(diǎn)可能需要這些內(nèi)容。頭元素的接收者扮演的角色類似于一個(gè)過(guò)濾器,防止這些只發(fā)給本接受者的消息部分?jǐn)U散到其它節(jié)點(diǎn)。即一個(gè)頭元素的接收者必須不轉(zhuǎn)發(fā)這些頭元素到SOAP消息路徑上的下一個(gè)應(yīng)用程序。同樣的,接收者可能插入一個(gè)相似的頭元素。
SOAP actor全局屬性可以用于指示頭元素的接收者。SOAP actor屬性的值是一個(gè)URI。URI "http://schemas.xmlsoap.org/soap/actor/next"指出了第一個(gè)處理這個(gè)消息的SOAP應(yīng)用程序需要這個(gè)頭元素。這類似于HTTP頭中用Connection域表示hop-by-hop范圍模型。
省略SOAP actor屬性表示接收者是SOAP消息的終節(jié)點(diǎn)。
如果這個(gè)屬性要生效,它必須出現(xiàn)在SOAP消息實(shí)例中。(見(jiàn)第3節(jié)和4.2.1節(jié))
4.2.3 SOAP mustUnderstand屬性 SOAP mustUnderstand全局屬性用來(lái)指示接受者在處理消息時(shí)這個(gè)條目是否必須處理。條目的接收者由SOAP actor屬性定義(見(jiàn)4.2.2節(jié))。MustUnderstand屬性的值是"1" 或 "0"。缺少SOAP mustUnderstand屬性在語(yǔ)義上等同于它的值為"0"。
如果一個(gè)頭元素的SOAP mustUnderstand屬性的值是"1",那么條目的接受者必須或者遵守語(yǔ)義(如以元素的全名傳送)并按照語(yǔ)義正確的處理,或者放棄處理消息(見(jiàn)4.4節(jié))。
SOAP mustUnderstand 屬性考慮了消息演變的準(zhǔn)確性(robust evolution)。必須假定包含SOAP mustUnderstand屬性且值為"1"的元素以某種方式修改了它們的父元素或同層元素的語(yǔ)義。以這種方式連接元素確保了語(yǔ)義上的變化不會(huì)被那些不能完全理解它的接收者忽略。
如果這個(gè)屬性要生效,它必須出現(xiàn)在SOAP消息實(shí)例中。(見(jiàn)第3節(jié)和4.2.1節(jié))
4.3 SOAP體 SOAP體元素提供了一個(gè)簡(jiǎn)單的機(jī)制,使消息的最終接收者能交換必要的信息。使用體元素的典型情況包括配置RPC請(qǐng)求和錯(cuò)誤報(bào)告。
體元素編碼為SOAP封裝元素的直接子元素。如果已經(jīng)有一個(gè)頭元素,那么體元素必須緊跟在頭元素之后,否則它必須是SOAP封裝元素的第一個(gè)直接子元素。
體元素的所有直接子元素稱作體條目,每個(gè)體條目在SOAP體元素中編碼為一個(gè)獨(dú)立的元素。
條目的編碼規(guī)則如下:
一個(gè)條目由它的元素全名(包括名域URI和局部名)確定。SOAP體元素的直接子元素可能是名域限制的。 SOAP encodingStyle屬性可能用來(lái)指示條目(見(jiàn)4.1.1節(jié))的編碼方式。 SOAP定義了一個(gè)Fault條目用來(lái)報(bào)告錯(cuò)誤信息。(見(jiàn)4.4節(jié))
4.3.1 SOAP頭和體的關(guān)系 雖然頭和體定義為獨(dú)立的元素,它們實(shí)際上是有關(guān)系的。體條目和頭條目的關(guān)系如下:體條目在語(yǔ)義上等同于actor屬性為缺省值且mustUnderstand屬性值為"1"的頭條目。不使用actor屬性則表示缺省的actor。(見(jiàn)4.2.2節(jié))
4.4 SOAP錯(cuò)誤 SOAP錯(cuò)誤元素用于在SOAP消息中攜帶錯(cuò)誤和(或)狀態(tài)信息。如果有SOAP錯(cuò)誤元素,它必須以以體條目的方式出現(xiàn),并且在一個(gè)體元素中最多出現(xiàn)一次。
SOAP錯(cuò)誤元素定義了以下四個(gè)子元素:
faultcode faultcode元素給軟件提供了一個(gè)識(shí)別此錯(cuò)誤的算法機(jī)制。SOAP錯(cuò)誤元素必須有faultcode子元素,并且它的值必須是一個(gè)合法的名(在[8]節(jié)定義)。SOAP定義一些SOAP faultcode描述基本的SOAP錯(cuò)誤(見(jiàn)4.4.1節(jié))。 faultstring faultstring元素提供了一個(gè)錯(cuò)誤解釋,而不是為了軟件處理。faultstring元素類似于HTTP中定義(見(jiàn)[5],第6.1節(jié))的'Reason-Phrase'。SOAP錯(cuò)誤元素必須有faultstring子元素,并且它應(yīng)該提供一些錯(cuò)誤本質(zhì)的解釋信息。 faultactor faultactor元素提供了在消息路徑上是誰(shuí)導(dǎo)致了錯(cuò)誤發(fā)生的信息(見(jiàn)第2節(jié))。它類似于SOAP actor屬性(見(jiàn)4.2.2節(jié)),只是SOAP actor指的是頭條目的目的地,faultactor指的是錯(cuò)誤的來(lái)源。faultactor屬性的值是用來(lái)區(qū)分錯(cuò)誤來(lái)源的URI。不是SOAP消息的最終目的地的應(yīng)用程序必須在SOAP Fault元素中包含faultactor元素。消息的最終目的地可以使用faultactor元素明確的指示是它產(chǎn)生了這個(gè)錯(cuò)誤(參見(jiàn)下面的detail元素) detail detail元素用來(lái)攜帶與Body元素有關(guān)的應(yīng)用程序所要的錯(cuò)誤信息。如果Body元素的內(nèi)容不能被成功的處理,則必須包含detail子元素。它不能用來(lái)攜帶屬于頭條目的錯(cuò)誤信息。頭條目的詳細(xì)出錯(cuò)信息必須由頭條目攜帶。 Fault元素中沒(méi)有detail元素表示這個(gè)錯(cuò)誤與Body元素的處理無(wú)關(guān)。在有錯(cuò)誤的時(shí)候,這可以用來(lái)區(qū)分Body元素有沒(méi)有被正確的處理。
detail元素的所有直接子元素稱作detail條目,并且每個(gè)detail條目在detail元素中編碼為獨(dú)立的元素。
detail條目的編碼規(guī)則如下(參見(jiàn)例10): 一個(gè)detail條目由它的元素全名(包括名域URI和局部名)確定。SOAP體元素的直接子元素可能是名域限制的。 SOAP encodingStyle屬性可能用來(lái)指示detail條目(見(jiàn)4.1.1節(jié))的編碼方式。 也可以有其它的Fault子元素,只要它們是名域限制的。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!