<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

         轉(zhuǎn)載地址:http://bbs.soft456.com/read.php?tid=496

    SOAP協(xié)議規(guī)范

    1. 簡(jiǎn)介
    SOAP以XML形式提供了一個(gè)簡(jiǎn)單、輕量的用于在分散或分布環(huán)境中交換結(jié)構(gòu)化和類型信息的機(jī)制。SOAP本身并沒有定義任何應(yīng)用程序語義,如編程模型或特定語義的實(shí)現(xiàn);實(shí)際上它通過提供一個(gè)有標(biāo)準(zhǔn)組件的包模型和在模塊中編碼數(shù)據(jù)的機(jī)制,定義了一個(gè)簡(jiǎn)單的表示應(yīng)用程序語義的機(jī)制。這使SOAP能夠被用于從消息傳遞到RPC的各種系統(tǒng)。
    SOAP包括三個(gè)部分
    ·      SOAP封裝(見第4節(jié))結(jié)構(gòu)定義了一個(gè)整體框架用來表示消息中包含什么內(nèi)容,誰來處理這些內(nèi)容以及這些內(nèi)容是可選的或是必需的。
    ·      SOAP編碼規(guī)則(見第5節(jié))定義了用以交換應(yīng)用程序定義的數(shù)據(jù)類型的實(shí)例的一系列機(jī)制。
    ·      SOAP RPC表示(見第7節(jié))定義了一個(gè)用來表示遠(yuǎn)程過程調(diào)用和應(yīng)答的協(xié)定。
    雖然這三個(gè)部分都作為SOAP的一部分一起描述,但它們?cè)诠δ苌鲜窍嘟坏摹L貏e的,封裝和編碼規(guī)則是在不同的名域中定義的,這種模塊性的定義方法增加了簡(jiǎn)單性在SOAP封裝,SOAP編碼規(guī)則和SOAPRPC協(xié)定之外,這個(gè)規(guī)范還定義了兩個(gè)協(xié)議的綁定,描述了在有或沒有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“(在XMLSchema規(guī)范[11]定義)相連。類似的,名域前綴”xsd“被假定為與URI"http://www.w3.org/1999/XMLSchema"(在[10]中定義)相連。名域前綴”tns“用來表示任意名域。所有其它的名域前綴都只是例子。
    名域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名域用來區(qū)分SOAP標(biāo)志符和應(yīng)用程序特定的標(biāo)志符。這個(gè)例子說明了在第6節(jié)中定義的HTTP綁定。如果SOAP中管理XML負(fù)載的規(guī)則完全獨(dú)立于HTTP是沒有意義的,因?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)可以通過開發(fā)特定網(wǎng)絡(luò)系統(tǒng)的特性來優(yōu)化。例如,HTTP綁定(見第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)作來處理消息:識(shí)別應(yīng)用程序想要的SOAP消息的所有部分 (見4.2.2節(jié))檢驗(yàn)應(yīng)用程序是否支持第一步中識(shí)別的消息中所有必需部分并處理它。如果不支持,則丟棄消息(見4.4節(jié))。在不影響處理結(jié)果的情況下,處理器可能忽略第一步中識(shí)別出的可選部分。如果這個(gè)SOAP應(yīng)用程序不是這個(gè)消息的最終目的地,則在轉(zhuǎn)發(fā)消息之前刪除第一步中識(shí)別出來的所有部分。為了正確處理一條消息或者消息的一部分,SOAP處理器需要理解:所用的交換方式(單向,請(qǐng)求/應(yīng)答,多路發(fā)送等等),這種方式下接收者的任務(wù),RPC機(jī)制(如果有的話)的使用(如第7節(jié)中所述),數(shù)據(jù)的表現(xiàn)方法或編碼,還有其它必需的語義。盡管屬性(比如SOAP encodingstyle,見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)見[7])一個(gè)SOAP應(yīng)用程序產(chǎn)生的消息中,所有由SOAP定義的元素和屬性中必須包括正確的名域。SOAP應(yīng)用程序必須能夠處理它接收到的消息中的SOAP名域(見4.4節(jié)),并且它可以處理沒有SOAP名域的SOAP消息,就象它們有正確的名域一樣。SOAP定義了兩個(gè)名域(更多有關(guān)XML名域的信息請(qǐng)見[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"屬性來指定一個(gè)元素的唯一的標(biāo)志符,同時(shí)該屬性是局部的和無需校驗(yàn)的。SOAP使用"uri-reference"類型的"href"屬性指定對(duì)這個(gè)值的引用,同時(shí)該屬性是局部的和無需校驗(yàn)的。這樣就遵從了XML規(guī)范[7],XMLSchema規(guī)范[11]和XML連接語言規(guī)范[9]的風(fēng)格。除了SOAP mustUnderstand 屬性(見4.2.3節(jié))和SOAPactor屬性(見4.2.2節(jié))之外,一般允許屬性和它們的值出現(xiàn)在XML文檔實(shí)例或Schema中(兩者效果相同)。也就是說,在DTD或Schema中聲明一個(gè)缺省值或固定值和在XML文檔實(shí)例中設(shè)置它的值在語義上相同。
    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消息包括以下部分:1.在表示這個(gè)消息的XML文檔中,封裝是頂層元素。2.應(yīng)用SOAP交換信息的各方是分散的且沒有預(yù)先協(xié)定,SOAP頭提供了向SOAP消息中添加關(guān)于這條SOAP消息的某些要素(feature)的機(jī)制。SOAP定義了少量的屬性用來表明這項(xiàng)要素(feature)是否可選以及由誰來處理。(見4.2節(jié))3.SOAP體是包含消息的最終接收者想要的信息的容器(見4.3節(jié))。SOAP為SOAP體定義了一個(gè)Fault元素用來報(bào)告錯(cuò)誤信息。語法規(guī)則如下所示:
    封裝
    1.      元素名是 "Envelope"
    2.      在SOAP消息中必須出現(xiàn)。
    3.      可以包含名域聲明和附加屬性。如果包含附加屬性,這些屬性必須限定名域。類似的,"Envelope"可以包含附加子元素,這些也必須限定名域且跟在SOAP體元素之后。
    SOAP頭 (見4.2節(jié))
    1.      元素名是"Header"
    2.      在SOAP消息中可能出現(xiàn)。如果出現(xiàn)的話,必須是SOAP封裝元素的第一個(gè)直接子元素。
    3.      SOAP頭可以包含多個(gè)條目,每個(gè)都是SOAP頭元素的直接子元素。所有SOAP頭的直接子元素都必須限定名域。
    SOAP體 (見4.3節(jié))
    1.      元素名是"Body"
    2.      在SOAP消息中必須出現(xiàn)且必須是SOAP封裝元素的直接子元素。它必須直接跟在SOAP頭元素(如果有)之后。否則它必須是SOAP封裝元素的第一個(gè)直接子元素。
    3.      SOAP體可以包括多個(gè)條目,每個(gè)條目必須是SOAP體元素的直接子元素。SOAP體元素的直接子元素可以限定名域。SOAP定義了SOAPFault元素來表示錯(cuò)誤信息。
    4.1.1 SOAP encodingStyle屬性
    EncodingStyle全局屬性用來表示SOAP消息的序列化規(guī)則。這個(gè)屬性可以在任何元素中出現(xiàn),作用范圍與名域聲明的作用范圍很相似,為這個(gè)元素的內(nèi)容和它的所有沒有重載此屬性的子元素。SOAP消息沒有定義缺省編碼。屬性值是一個(gè)或多個(gè)URI的順序列表,每個(gè)URI確定了一種或多種序列化規(guī)則,用來不同程度反序列化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屬性說明這一點(diǎn)。另外,所有以"http://schemas.xmlsoap.org/soap/encoding/"開頭的URI中的序列化規(guī)則與第5節(jié)中定義的SOAP編碼規(guī)則相一致。一個(gè)零長(zhǎng)度的URI("")明確顯示所含元素沒有任何編碼形式。這可以用來取消上一級(jí)元素的所有編碼聲明。
    4.1.2 封裝版本模型
    SOAP沒有定義常規(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è)消息。如果消息是通過HTTP之類的請(qǐng)求/應(yīng)答協(xié)議收到的,應(yīng)用程序必須回答一個(gè)SOAP VersionMismatch 錯(cuò)誤信息(見4.4節(jié))。
    4.2 SOAP頭
    SOAP為相互通信的團(tuán)體之間提供了一種很靈活的機(jī)制:在無須預(yù)先協(xié)定的情況下,以分散但標(biāo)準(zhǔn)的方式擴(kuò)展消息。可以在SOAP頭中添加條目實(shí)現(xiàn)這種擴(kuò)展,典型的例子有認(rèn)證,事務(wù)管理,支付等等。頭元素編碼為SOAP封裝元素的第一個(gè)直接子元素。頭元素的所有直接子元素稱作條目。條目的編碼規(guī)則如下:
    一個(gè)條目有它的完整的元素名(包括名域URI和局部名)確定。SOAP頭的直接子元素必須有名域限制。
    SOAP encodingStyle屬性可以用來指示條目所用的編碼形式(見4.1.1節(jié))
    SOAP mustUnderstand屬性(見4.2.3節(jié))和SOAPactor屬性(見4.2.2節(jié))可以用來指示如何處理這個(gè)條目以及由誰來處理。(見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)的過程中,可能沿著消息路徑經(jīng)過一系列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è)過濾器,防止這些只發(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í)例中。(見第3節(jié)和4.2.1節(jié))
    4.2.3 SOAP mustUnderstand屬性
    SOAP mustUnderstand全局屬性用來指示接受者在處理消息時(shí)這個(gè)條目是否必須處理。條目的接收者由SOAP actor屬性定義(見4.2.2節(jié))。MustUnderstand屬性的值是"1" 或 "0"。缺少SOAP mustUnderstand屬性在語義上等同于它的值為"0"。如果一個(gè)頭元素的SOAP mustUnderstand屬性的值是"1",那么條目的接受者必須或者遵守語義(如以元素的全名傳送)并按照語義正確的處理,或者放棄處理消息(見4.4節(jié))。SOAP mustUnderstand 屬性考慮了消息演變的準(zhǔn)確性(robust evolution)。必須假定包含SOAP mustUnderstand屬性且值為"1"的元素以某種方式修改了它們的父元素或同層元素的語義。以這種方式連接元素確保了語義上的變化不會(huì)被那些不能完全理解它的接收者忽略。如果這個(gè)屬性要生效,它必須出現(xiàn)在SOAP消息實(shí)例中。(見第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屬性可能用來指示條目(見4.1.1節(jié))的編碼方式。
    ·      SOAP定義了一個(gè)Fault條目用來報(bào)告錯(cuò)誤信息。(見4.4節(jié))
    4.3.1 SOAP頭和體的關(guān)系
    雖然頭和體定義為獨(dú)立的元素,它們實(shí)際上是有關(guān)系的。體條目和頭條目的關(guān)系如下:體條目在語義上等同于actor屬性為缺省值且mustUnderstand屬性值為"1"的頭條目。不使用actor屬性則表示缺省的actor。(見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ò)誤(見4.4.1節(jié))。
    ·      faultstring
    faultstring元素提供了一個(gè)錯(cuò)誤解釋,而不是為了軟件處理。faultstring元素類似于HTTP中定義(見[5],第6.1節(jié))的'Reason-Phrase'。SOAP錯(cuò)誤元素必須有faultstring子元素,并且它應(yīng)該提供一些錯(cuò)誤本質(zhì)的解釋信息。
    ·      faultactor
    faultactor元素提供了在消息路徑上是誰導(dǎo)致了錯(cuò)誤發(fā)生的信息(見第2節(jié))。它類似于SOAP actor屬性(見4.2.2節(jié)),只是SOAP actor指的是頭條目的目的地,faultactor指的是錯(cuò)誤的來源。faultactor屬性的值是用來區(qū)分錯(cuò)誤來源的URI。不是SOAP消息的最終目的地的應(yīng)用程序必須在SOAP Fault元素中包含faultactor元素。消息的最終目的地可以使用faultactor元素明確的指示是它產(chǎn)生了這個(gè)錯(cuò)誤(參見下面的detail元素)
    ·      detail
    detail元素用來攜帶與Body元素有關(guān)的應(yīng)用程序所要的錯(cuò)誤信息。如果Body元素的內(nèi)容不能被成功的處理,則必須包含detail子元素。它不能用來攜帶屬于頭條目的錯(cuò)誤信息。頭條目的詳細(xì)出錯(cuò)信息必須由頭條目攜帶。Fault元素中沒有detail元素表示這個(gè)錯(cuò)誤與Body元素的處理無關(guān)。在有錯(cuò)誤的時(shí)候,這可以用來區(qū)分Body元素有沒有被正確的處理。detail元素的所有直接子元素稱作detail條目,并且每個(gè)detail條目在detail元素中編碼為獨(dú)立的元素。detail條目的編碼規(guī)則如下(參見例10): 一個(gè)detail條目由它的元素全名(包括名域URI和局部名)確定。SOAP體元素的直接子元素可能是名域限制的。SOAP encodingStyle屬性可能用來指示detail條目(見4.1.1節(jié))的編碼方式。也可以有其它的Fault子元素,只要它們是名域限制的。
    4.4.1 SOAP 錯(cuò)誤代碼
    在描述這個(gè)規(guī)范中定義的錯(cuò)誤時(shí),這一節(jié)中定義的Faultcode值必須用在faultcode元素中。這些faultcode值得名域標(biāo)志符為"http://schemas.xmlsoap.org/soap/envelope/"。定義這個(gè)規(guī)范之外的方法時(shí)推薦(不要求)使用這個(gè)名域。缺省的SOAP faultcode值以可擴(kuò)展的方式定義,允許定義新的SOAP faultcode值,并與現(xiàn)有的faultcode值向后兼容。使用的機(jī)制類似于HTTP中定義的1xx, 2xx,3xx等基本的狀態(tài)類(見[5]第10節(jié)),不過,它們定義為XML合法名(見 [8] 第3節(jié) ),而不是整數(shù)。 字符"."(點(diǎn))作為faultcode的分隔符,點(diǎn)左邊的錯(cuò)誤代碼比右邊的錯(cuò)誤代碼更為普通。如:
    Client.Authentication
    這篇文檔中定義的faultcode值是:
    名稱      含義
    VersionMismatch      處理方發(fā)現(xiàn)SOAP封裝元素有不合法的名域(見4.1.2節(jié))
    MustUnderstand      處理方不理解或者不服從一個(gè)包含值為"1"的
    mustUnderstand      屬性的 SOAP頭元素的直接子元素。(見4.2.3節(jié))
    Client
    Client錯(cuò)誤類表示消息的格式錯(cuò)誤或者不包含適當(dāng)?shù)恼_信息。例如,消息可能缺少正確的認(rèn)證和支付信息。一般地,它表示消息不能不作修改就重發(fā)。參見4.4節(jié)
    SOAP Fault detail子元素的描述。
    Server
    Server錯(cuò)誤類表示由于消息的處理過程而不是消息的內(nèi)容本身使得消息消息不能正確的處理。例如,處理消息時(shí)可能要與其它處理器通信,但它沒有響應(yīng)。這個(gè)消息可能在遲一點(diǎn)的時(shí)間處理成功。 SOAP Fault子元素的詳細(xì)信息參見4.4節(jié)
    5. SOAP編碼
    SOAP編碼格式基于一個(gè)簡(jiǎn)單的類型系統(tǒng),概括了程序語言,數(shù)據(jù)庫和半結(jié)構(gòu)化數(shù)據(jù)等類型系統(tǒng)的共同特性。一個(gè)類型或者是一個(gè)簡(jiǎn)單的(標(biāo)量的)類型,或者是由幾個(gè)部分組合而成的復(fù)合類型,其中每個(gè)部分都有自己的類型。以下將詳細(xì)描述這些類型。這一節(jié)定義了類型化對(duì)象的序列化規(guī)則。它分兩個(gè)層次。首先,給定一個(gè)與類型系統(tǒng)的符號(hào)系統(tǒng)一致的Schema(譯者注:這里的schema不是符合XML語法的schema,而僅僅表示廣義的用于表示消息結(jié)構(gòu)的定義方式),就構(gòu)造了XML語法的Schema。然后,給定一個(gè)類型系統(tǒng)的Schema和與這個(gè)Schema一致的特定的值,就構(gòu)造了一個(gè)XML文檔實(shí)例。反之,給定一個(gè)依照這些規(guī)則產(chǎn)生的XML文檔實(shí)例和初始的Schema,就可以構(gòu)造初始值的一個(gè)副本。這一節(jié)中定義的元素和屬性的名域標(biāo)志符為"http://schemas.xmlsoap.org/soap/encoding/"。下面的例子都假定在上一層的元素中聲明了名域。
    鼓勵(lì)使用這一節(jié)中描述的數(shù)據(jù)模型和編碼方式,但也可以在SOAP中使用其他的數(shù)據(jù)模型和編碼方式。(見4.1.1節(jié))
    5.1 XML中的編碼類型規(guī)則
    XML允許非常靈活的數(shù)據(jù)編碼方式。SOAP定義了一個(gè)較小的規(guī)則集合。這一節(jié)在總的層次上定義了這些編碼規(guī)則,下一節(jié)將描述特定類型的編碼規(guī)則的細(xì)節(jié)。這一節(jié)定義的編碼規(guī)則可以與第7節(jié)中所述的RPC調(diào)用和應(yīng)答映射結(jié)合使用。下面的術(shù)語用來描述編碼規(guī)則:
    ·      一個(gè)"value"是一個(gè)字符串,類型(數(shù)字,日期,枚舉等等)的名或是幾個(gè)簡(jiǎn)單值的組合。所有的值都有特定的類型。
    ·      一個(gè)"simple value"沒有名部分, 如特定的字符串,整數(shù),枚舉值等等。
    ·      一個(gè)"compound value"是相關(guān)的值的結(jié)合,如定單,股票報(bào)表,街道地址等等。在"compound value"中,每個(gè)相關(guān)的值都潛在的以名,序數(shù)或這兩者來區(qū)分。這叫作"a ccessor"。復(fù)合值的例子有定單和股票報(bào)表等等。數(shù)組也是復(fù)合值。在復(fù)合值中,多個(gè)accessor有相同的名是允許的,例如RDF就是這樣做的。
    ·      一個(gè)"array"是一個(gè)復(fù)合值,成員值按照在數(shù)組中的位置相互區(qū)分。
    ·      一個(gè)"struct"也是一個(gè)復(fù)合值,成員值之間的唯一區(qū)別是accessor名,accessor名互不相同。
    ·      一個(gè)"simple type"是簡(jiǎn)單值的類,如叫做"string" "integer"的類,還有枚舉類等等。
    ·      一個(gè)"compound type"是復(fù)合值的類。復(fù)合類型的例子有定單類,它們有相同的accessor名(shipTo, totalCost等),但可能會(huì)有不同的值(可能以后被設(shè)置為確定的值)。
    在復(fù)合類型中,如果類型內(nèi)的accessor名互不相同,但是可能與其他類型中的accessor名相同,即,accessor名加上類型名形成一個(gè)唯一的標(biāo)志符,這個(gè)名叫作"局部范圍名"。如果名是直接或間接的基于URI的一部分,那么不管它出現(xiàn)在什么類型中,這個(gè)名本身就可以唯一標(biāo)志這個(gè)accessor,這樣的名叫作"全局范圍名"。給定了schema中相關(guān)的值的序列化信息,就可能確定某些值只與某個(gè)accessor的一個(gè)實(shí)例有關(guān)。其它情況下則無法確定。當(dāng)且僅當(dāng)一個(gè)accessor引用一個(gè)值,這個(gè)值才能被視為"single-reference",如果有不止一個(gè)accessor引用它,那么就將它視為"multi-reference"。注意,可能一個(gè)確定的值在一個(gè)schema中是"single-reference",而在另一個(gè)schema中是"multi-reference"。在語句構(gòu)成上,一個(gè)元素可能是"independent" 或 "embedded"。一個(gè)獨(dú)立的元素指出現(xiàn)在序列化最頂層的任何元素。所有其它元素都是嵌入元素。雖然用xsi:type屬性可以使值的結(jié)構(gòu)和類型變?yōu)樽悦枋龅模切蛄谢?guī)則允許值的類型僅僅參照schema而定。這樣的schema可能使用"XML Schema Part 1: Structures" [10]和"XML Schema Part 2: Datatypes" [11]中描述的符號(hào)系統(tǒng),也可能使用其它符號(hào)系統(tǒng)。注意,雖然序列化規(guī)則可以用于除了數(shù)組和結(jié)構(gòu)之外的復(fù)合類型,但是許多schema僅僅包含數(shù)組和結(jié)構(gòu)類型。序列化規(guī)則如下:
    所有的值以元素內(nèi)容的形式表示。一個(gè)multi-reference值必須表示為一個(gè)獨(dú)立元素的內(nèi)容,而一個(gè)single-reference值最好不要這樣表示(也可以這樣表示)。對(duì)于每個(gè)具有值的元素,值的類型時(shí)必須用下述三種方式之一描述:
    ·      所屬元素實(shí)例有xsi:type屬性
    ·      所屬元素是一個(gè)有SOAP-ENC:arrayType 屬性(該屬性可能是缺省的)的元素的子元素,或者
    ·      所屬元素的名具有特定的類型,類型可以由schema確定。
    一個(gè)簡(jiǎn)單值表示為字符數(shù)據(jù),即沒有任何子元素。每個(gè)簡(jiǎn)單值必須具有一個(gè)類型,這個(gè)類型或者是XML Schemas Specification, part 2 [11]有的類型,或者具有源類型(參見5.2節(jié))。一個(gè)復(fù)合值編碼成一個(gè)元素的序列,每個(gè)accessor用一個(gè)嵌入元素表示,該元素的元素名和accessor的名一致。如果accessor的名是局部于其所屬的類型的,則該元素的元素名不是合格的,否則對(duì)應(yīng)的元素名是合格的。(參見5.4節(jié))
    一個(gè)multi-reference的簡(jiǎn)單值或復(fù)合值編碼成一個(gè)獨(dú)立的元素,這個(gè)元素包含一個(gè)局部的無需校驗(yàn)的屬性,屬性名為"id",類型為"ID"(依照XML Specification [7])。值的每個(gè)accessor對(duì)應(yīng)一個(gè)空元素,該元素有一個(gè)局部的,無需校驗(yàn)的屬性,屬性名為"href",類型為" uri-reference "(依照XML Schema Specification [11]),"href"屬性的值引用了相對(duì)應(yīng)的獨(dú)立元素的URI標(biāo)志符。字符串和字符數(shù)組表示為multi-reference的簡(jiǎn)單類型,但是特殊的規(guī)則使它們?cè)谄胀ǖ那闆r下能被更有效的表示(參見5.2.1節(jié)和5.2.3節(jié))。字符串和字符數(shù)組值的accessor可能有一個(gè)名字為"id",類型為"ID"(依照XML Specification [7])的屬性。如果這樣,所有這個(gè)值的所有其它accessor編碼成一個(gè)空元素,這個(gè)元素有一個(gè)局部的,無需校驗(yàn)的屬性,屬性名為"href",類型為" uri-reference "(依照XML Schema Specification [11]),"href"屬性的值引用了包含這個(gè)值的元素的URI標(biāo)志符。編碼時(shí)允許一個(gè)值有多個(gè)引用,就像多個(gè)不同的值有多個(gè)引用一樣,但這僅在從上下文可以知道這個(gè)XML文檔實(shí)例的含義沒有改變時(shí)才可使用。數(shù)組是復(fù)合值(參見5.4.2節(jié))。SOAP數(shù)組定義為具有類型"SOAP-ENC:Array"或從它衍生的類型.
    SOAP數(shù)組可以時(shí)一維或多維,它們的成員以序數(shù)位置相互區(qū)分。一個(gè)數(shù)組值表示為反映這個(gè)數(shù)組的一系列元素,數(shù)組成員按升序出現(xiàn)。對(duì)多維數(shù)組來說,右邊的這一維變化最快。每個(gè)成員元素命名為一個(gè)獨(dú)立元素。(見規(guī)則2)SOAP數(shù)組可以是single-reference 或multi-reference值,因此可以表示為嵌入元素或獨(dú)立元素的內(nèi)容。SOAP數(shù)組必須包含一個(gè)"SOAP-ENC:arrayType"屬性,它的值指定了包含元素的類型和數(shù)組的維數(shù)。"SOAP-ENC:arrayType"屬性的值定義如下:
    arrayTypeValue = atype asize
    atype = QName *( rank )
    rank = "[" *( "," ) "]"
    asize = "[" #length "]"
    length = 1*DIGIT
    ·      "atype"結(jié)構(gòu)是被包含元素的類型名,它表示為QName并且作為類型限制在XML元素聲明的
    ·      "type"屬性中出現(xiàn)(這意味著被包含元素的所有值都要與該類型一致,即在SOAP-ENC:a rrayType中引用的類型必須是每個(gè)數(shù)組成員的類型或超類型)。在arrays of arrays or "jagged arrays"的情況下,類型組件編碼為"innermost"類型且在從第一層開始的嵌套數(shù)組的每一層中,類型名后都跟隨一個(gè)rank結(jié)構(gòu)。多維數(shù)組編碼時(shí)從第一維起,每一維之間用逗號(hào)隔開。
    ·      "asize"結(jié)構(gòu)包含一個(gè)以逗號(hào)分隔的列表,數(shù)值0,1或其它整數(shù)表示數(shù)組每一維的長(zhǎng)度。整數(shù)0表示沒有指定詳細(xì)的大小,但是可能在檢查數(shù)組實(shí)際成員的大小后確定。例如,一個(gè)5個(gè)成員的整型數(shù)組的arrayTypeValue值為"int[][5]",它的atype值是int[]",asize值是"[5]"。同樣,一個(gè)3個(gè)成員的兩維整型數(shù)組的arrayTypeValue值為"int[,][3]",它的atype值是int[,]",asize值是"[3]"。
    一個(gè)SOAP數(shù)組成員可能包含一個(gè)"SOAP-ENC:offset"屬性表示這一項(xiàng)在整個(gè)數(shù)組中的位置偏移值。這被用來指示一個(gè)部分儲(chǔ)值數(shù)組(見5.4.2.1節(jié))的位置偏移值。同樣,一個(gè)數(shù)組成員可能包含一個(gè)"SOAP-ENC:position"屬性表示這一項(xiàng)在整個(gè)數(shù)組中的位置,這被用來描述稀疏數(shù)組(見5.4.2.2節(jié))的成員。"SOAP-ENC:offset" 和"SOAP-ENC:position"屬性值的定義如下:
    arrayPoint = "[" #length "]"
    偏移值和位置從0開始
    NULL值或缺省值可能通過省略accssor元素來表示。NULL值也可能通過一個(gè)包含值為?'的xsi:null屬性的accssor元素來表示,其它的依賴于應(yīng)用程序的屬性和值也可能用來表示NULL值。注意,規(guī)則2允許獨(dú)立的元素和數(shù)組成員名不同于值類型的元素。
    5.2 簡(jiǎn)單類型
    SOAP采用了"XML Schema Part 2: Datatypes"規(guī)范[11]"Built-in datatypes"節(jié)中的所有類型作為簡(jiǎn)單類型,包括值和取值范圍。例如:
    類型      舉例
    int      58502
    float      314159265358979E+1
    negativeInteger      -32768
    string      Louis "Satchmo" Armstrong
    在XML Schema規(guī)范中聲明的數(shù)據(jù)類型可以直接用在元素schema中,也可以使用從這些類型衍生的新類型。一個(gè)schema和對(duì)應(yīng)的具有這些類型的元素的數(shù)據(jù)實(shí)例的例子如下所示:
    <element name="age" type="int"/>
    <element name="height" type="float"/>
    <element name="displacement" type="negativeInteger"/>
    <element name="color">
    <simpleType base="xsd:string">
    <enumeration value="Green"/>
    <enumeration value="Blue"/>
    </simpleType>
    </element>
    <age>45</age>
    <height>5.9</height>
    <displacement>-450</displacement>
    <color>Blue</color>
    所有簡(jiǎn)單值必須編碼為元素的內(nèi)容,它的類型或者在"XML Schema Part 2: Datatypes"規(guī)范[11]中定義過,或者是基于一個(gè)用XML Schema規(guī)范提供的機(jī)制能推衍生出的類型。如果一個(gè)簡(jiǎn)單值編碼為獨(dú)立元素或異質(zhì)數(shù)組成員,那么有一個(gè)對(duì)應(yīng)于數(shù)據(jù)類型的元素聲明將會(huì)很方便。因?yàn)?XML Schema Part 2: Datatypes"規(guī)范[11]包括了類型定義,但是不包括對(duì)應(yīng)的元素聲明,SOAP-ENC schema和名域?yàn)槊總€(gè)簡(jiǎn)單數(shù)據(jù)類型聲明了一個(gè)元素,如<SOAP-ENC:int id="int1">45</SOAP-ENC:int>
    5.2.1 字符串
    字符串?dāng)?shù)據(jù)類型的定義在"XML Schema Part 2: Datatypes"規(guī)范[11]中。注意,這不同于許多數(shù)據(jù)庫和程序語言中的"string"類型,特別的,字符串?dāng)?shù)據(jù)類型可能禁止某些在那些語言中允許的字符。(這些值必須用xsd:string之外的數(shù)據(jù)類型表示)一個(gè)字符串可能編碼為一個(gè)single-reference 或 multi-reference值。包含字符串值的元素可能有一個(gè)"id"屬性。附加的accessor元素可能有對(duì)應(yīng)的"href"屬性。
    例如,同一字符串的兩個(gè)accessor可能以如下形式出現(xiàn):
    <greeting id="String-0">Hello</greeting>
    <salutation href="#String-0"/>
    但是,如果兩個(gè)accessor參考同一字符串實(shí)例(或字符串的子類型),這不是一個(gè)實(shí)質(zhì)問題,它們可以編碼為兩個(gè)single-reference值,如下所示:
    <greeting>Hello</greeting>
    <salutation>Hello</salutation>
    這個(gè)例子的schema片斷如下所示:
    <element name="greeting" type="SOAP-ENC:string"/>
    <element name="salutation" type="SOAP-ENC:string"/>
    在這個(gè)例子中,SOAP-ENC:string類型用作元素的類型,這是聲明數(shù)據(jù)類型是"xsd:string"且允許"id" 和"href"屬性的元素的簡(jiǎn)便方法。精確定義參見SOAP編碼schema。Schemas可以使用這些源自SOAP編碼schema的聲明,但也可以不這樣做。
    5.2.2 Enumerations
    "XML Schema Part 2: Datatypes"規(guī)范 [11] 定義了"enumeration."機(jī)制。SOAP數(shù)據(jù)模型直接采用了這種機(jī)制。但是,由于程序語言和其它語言在定義枚舉時(shí)通常有些不同,所以我們?cè)谶@里詳細(xì)闡述了它的概念并描述了一個(gè)列表成員的可能取的值是如何編碼的。"Enumeration"作為一個(gè)概念表示不同的名字的集合。一個(gè)特定的枚舉就是對(duì)應(yīng)于特定的基類型的不同的值的列表。例如,顏色集合("Green", "Blue", "Brown")可以定義為基于字符串類型的枚舉,("1", "3", "5")可能是一個(gè)基于整型數(shù)的枚舉,等等。"XML Schema Part 2: Datatypes" [11]支持除了布爾型以外所有簡(jiǎn)單類型的枚舉。"XML Schema Part 1: Structures"規(guī)范[10]的語言可以用來定義枚舉類型。如果schema由另一個(gè)沒有特定基類型適用的符號(hào)系統(tǒng)生成,就使用"string"。在下面schema的例子中,"EyeColor"定義為字符串,可能的值是"Green", "Blue", 或"Brown"的枚舉,數(shù)據(jù)實(shí)例按照schema顯示如下。
    <element name="EyeColor" type="tns:EyeColor"/>
    <simpleType name="EyeColor" base="xsd:string">
    <enumeration value="Green"/>
    <enumeration value="Blue"/>
    <enumeration value="Brown"/>
    </simpleType>
    <Person>
    <Name>Henry Ford</Name>
    <Age>32</Age>
    <EyeColor>Brown</EyeColor>
    </Person>
    5.2.3 字符數(shù)組
    一個(gè)字符數(shù)組可能編碼為single-reference 或multi-reference值。字符數(shù)組的編碼規(guī)則與字符串的編碼規(guī)則類似。特別的,包含字符數(shù)組的元素值可能由一個(gè)"id"屬性,附加的accssor元素可能有相應(yīng)的"href"屬性。推薦使用定義在XML Schemas [10][11]中的'base64'編碼(使用在2045 [13]中定義的base64編碼算法)表示模糊字符數(shù)組。不過,由于行長(zhǎng)度(line length)的限制,通常在MIME中應(yīng)用base64編碼,SOAP中一般不應(yīng)用base64編碼。但是提供了"SOAP-ENC:base64"子類型使之能用于SOAP。
    <picture xsi:type="SOAP-ENC:base64">
    aG93IG5vDyBicm73biBjb3cNCg==
    </picture>
    5.3 多態(tài)accessor
    許多語言允許能夠多態(tài)訪問多種類型值的accessor,每種類型在運(yùn)行時(shí)可用。一個(gè)多態(tài)accessor實(shí)例必須包含一個(gè)"xsi:type"屬性描述實(shí)際值的類型。例如,一個(gè)名為"cost"類型值為"xsd:float"的多態(tài)accessor編碼如下:
    <cost xsi:type="xsd:float">29.95</cost>與之對(duì)比,類型值不變的accessor編碼如下:
    <cost>29.95</cost>
    5.4 Compound types復(fù)合類型
    SOAP定義了與下列常在程序語言中出現(xiàn)的結(jié)構(gòu)性模式對(duì)應(yīng)的類型:
    ·      結(jié)構(gòu):一個(gè)"struct"是一個(gè)復(fù)合值,它的成員值的唯一區(qū)別是accessor名稱,任意兩個(gè)accessor名稱都不相同。
    ·      數(shù)組:一個(gè)"array"是一個(gè)復(fù)合值,它的成員值的唯一區(qū)別是序數(shù)位置。
    SOAP也允許結(jié)構(gòu)和數(shù)組之外的其它數(shù)據(jù)的序列化,例如Directed-Labeled-Graph Data Model之類的數(shù)據(jù)中,單個(gè)節(jié)點(diǎn)有許多不同的accssor,有些不止出現(xiàn)一次。SOAP序列化規(guī)則不要求底層的數(shù)據(jù)模型在accssor之間區(qū)分次序,但如果有這樣的次序的話,這些accssor必須按照這個(gè)順序編碼。
    5.4.1 復(fù)合值,結(jié)構(gòu)和值引用
    復(fù)合值的成員編碼為accessor元素。當(dāng)accessor由名區(qū)分時(shí)(如結(jié)構(gòu)),accessor名即作為元素名。名局部于類型的accessor有不受限的名,其它的accessor則有受限的名。下面的例子是類型為"Book"的結(jié)構(gòu):
    <e:Book>
    <author>Henry Ford</author>
    <preface>Prefatory text</preface>
    <intro>This is a book.</intro>
    </e:Book>
    以下是描述上面結(jié)構(gòu)的schema片斷:
    <element name="Book">
    <complexType>
    <element name="author" type="xsd:string"/>
    <element name="preface" type="xsd:string"/>
    <element name="intro" type="xsd:string"/>
    </complexType>
    </e:Book>
    以下是一個(gè)同時(shí)具有簡(jiǎn)單和復(fù)雜成員類型的例子。它顯示兩層引用。注意"Author"accssor元素的"href"屬性是對(duì)相應(yīng)具有"id"屬性的值的引用。"Address"與之類似。
    <e:Book>
    <title>My Life and Work</title>
    <author href="#Person-1"/>
    </e:Book>
    <e:Person id="Person-1">
    <name>Henry Ford</name>
    <address href="#Address-2"/>
    </e:Person>
    <e:Address id="Address-2">
    <email>mailto:henryford@hotmail.com</email>
    <web>http://www.henryford.com</web>
    </e:Address>
    當(dāng)"Person"的值和"Address"的值是multi-reference時(shí),上面的形式是正確的。如果它
    們是single-reference,就必須用嵌入的形式,如下所示:
    <e:Book>
    <title>My Life and Work</title>
    <author>
    <name>Henry Ford</name>
    <address>
    <email>mailto:henryford@hotmail.com</email>
    <web>http://www.henryford.com</web>
    </address>
    </author>
    </e:Book>
    如果添加一個(gè)限制,任意兩個(gè)人都不會(huì)有相同的地址,并且地址可以是街道或Email地址,一本書可以有兩個(gè)作者,編碼如下:
    <e:Book>
    <title>My Life and Work</title>
    <firstauthor href="#Person-1"/>
    <secondauthor href="#Person-2"/>
    </e:Book>
    <e:Person id="Person-1">
    <name>Henry Ford</name>
    <address xsi:type="m:Electronic-address">
    <email>mailto:henryford@hotmail.com</email>
    <web>http://www.henryford.com</web>
    </address>
    </e:Person>
    <e:Person id="Person-2">
    <name>Samuel Crowther</name>
    <address xsi:type="n:Street-address">
    <street>Martin Luther King Rd</street>
    <city>Raleigh</city>
    <state>North Carolina</state>
    </address>
    </e:Person>
    序列化可以包含對(duì)不在同一個(gè)資源的值的引用:
    <e:Book>
    <title>Paradise Lost</title>
    <firstauthor />
    </e:Book>
    以下是描述上面結(jié)構(gòu)的schema片斷:
    <element name="Book" type="tns:Book"/>
    <complexType name="Book">
    <!-- Either the following group must occur or else the
    href attribute must appear, but not both. -->
    <sequence minOccurs="0" maxOccurs="1">
    <element name="title" type="xsd:string"/>
    <element name="firstauthor" type="tns:Person"/>
    <element name="secondauthor" type="tns:Person"/>
    </sequence>
    <attribute name="href" type="uriReference"/>
    <attribute name="id" type="ID"/>
    <anyAttribute namespace="##other"/>
    </complexType>
    <element name="Person" base="tns:Person"/>
    <complexType name="Person">
    <!-- Either the following group must occur or else the
    href attribute must appear, but not both. -->
    <sequence minOccurs="0" maxOccurs="1">
    <element name="name" type="xsd:string"/>
    <element name="address" type="tns:Address"/>
    </sequence>
    <attribute name="href" type="uriReference"/>
    <attribute name="id" type="ID"/>
    <anyAttribute namespace="##other"/>
    </complexType>
    <element name="Address" base="tns:Address"/>
    <complexType name="Address">
    <!-- Either the following group must occur or else the
    href attribute must appear, but not both. -->
    <sequence minOccurs="0" maxOccurs="1">
    <element name="street" type="xsd:string"/>
    <element name="city" type="xsd:string"/>
    <element name="state" type="xsd:string"/>
    </sequence>
    <attribute name="href" type="uriReference"/>
    <attribute name="id" type="ID"/>
    <anyAttribute namespace="##other"/>
    </complexType>

    5.4.2 數(shù)組
    SOAP數(shù)組定義為具有"SOAP-ENC:Array"類型或一個(gè)從"SOAP-ENC:Array"衍生的類型(參見規(guī)則8)。數(shù)組表示為元素值,對(duì)元素的名沒有特別的約束(正如元素值并不約束它們所屬的元素)。數(shù)組可以包含任意類型的元素,包括嵌套數(shù)組。可以創(chuàng)建新的類型(受SOAP-ENC:Array
    類型限制)來表示數(shù)組,如整數(shù)數(shù)組或某些用戶定義的枚舉。數(shù)組值表示為組成這個(gè)數(shù)組的項(xiàng)的元素的規(guī)則序列。在數(shù)組值中,元素名對(duì)于區(qū)分accesor并不重要。元素可以有任意的名。實(shí)際上,元素常常用它們?cè)趕chema中暗示或確定的數(shù)組類型來命名元素。并且一般情況下對(duì)于復(fù)合值來說,如果數(shù)組中數(shù)組項(xiàng)的值是single-reference值,則這個(gè)數(shù)組項(xiàng)包含它的值,否則,該數(shù)組項(xiàng)通過"href"屬性引用這個(gè)值。下面的例子是一個(gè)整型數(shù)組的schema片斷:
    <element name="myFavoriteNumbers"
    type="SOAP-ENC:Array"/>
    <myFavoriteNumbers
    SOAP-ENC:arrayType="xsd:int[2]">
    <number>3</number>
    <number>4</number>
    </myFavoriteNumbers>
    在這個(gè)例子中,數(shù)組"myFavoriteNumbers"包括幾個(gè)成員,每個(gè)成員是一個(gè)類型為SOAP-ENC:int的值。注意SOAP-ENC:Array允許不受限制的元素名,它們不傳達(dá)任何類型信息,所以在使用時(shí),或者它們有xsi:type屬性,或者它們所屬的元素有SOAP-ENC:arrayType屬性。自然,由SOAP-ENC:Array衍生的類型可以聲明局部元素,但這種情況下要包括類型信息。上面已經(jīng)提到,SOAP-ENC schema包含了元素的聲明,元素名與"XML Schema Part 2: Datatypes"規(guī)范[11]中的簡(jiǎn)單類型一致。其中包括了對(duì)"Array"的聲明。于是,我們可以這樣寫:
    <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:int[2]">
    <SOAP-ENC:int>3</SOAP-ENC:int>
    <SOAP-ENC:int>4</SOAP-ENC:int>
    </SOAP-ENC:Array>
    數(shù)組可以包含特定arrayType的任意子類型的實(shí)例。即,數(shù)組成員可以是arryType屬性值指定的類型的任意子類型,這個(gè)類型對(duì)于arrayType屬性中指定的類型來說是可替換的(根據(jù)schema中的替換規(guī)則)。例如,一個(gè)整型數(shù)組可以包含從整型衍生的任意類型(如"int"或任意用戶定義的從整型衍生的類型)。同樣,一個(gè)"address"數(shù)組可能包含一個(gè)address的受限類型或擴(kuò)展類型如"internationalAddress"。因?yàn)樘峁┑腟OAP-ENC:Array類型允許任意類型的成員,所以可以包含任意類型的混合除非使用arrayType屬性加以特別的限制。在實(shí)例中,可以使用xsi:type指定成員元素的類型,或通過schema中成員元素的聲明來指定。下面是兩個(gè)例子。
    <SOAP-ENC:Array SOAP-ENC:arrayType="SOAP-ENC:ur-type[4]">
    <thing xsi:type="xsd:int">12345</thing>
    <thing xsi:type="xsd:decimal">6.789</thing>
    <thing xsi:type="xsd:string">
    Of Mans First Disobedience, and the Fruit
    Of that Forbidden Tree, whose mortal tast
    Brought Death into the World, and all our woe,
    </thing>
    <thing xsi:type="xsd:uriReference"> http://www.dartmouth.edu/~milton/reading_room/ </thing>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array SOAP-ENC:arrayType="SOAP-ENC:ur-type[4]">
    <SOAP-ENC:int>12345</SOAP-ENC:int>
    <SOAP-ENC:decimal>6.789</SOAP-ENC:decimal>
    <xsd:string>
    Of Mans First Disobedience, and the Fruit
    Of that Forbidden Tree, whose mortal tast
    Brought Death into the World, and all our woe,
    </xsd:string>
    <SOAP-ENC:uriReference> http://www.dartmouth.edu/~milton/reading_room/ </SOAP-ENC:uriReference >
    </SOAP-ENC:Array>
    數(shù)組值可以是結(jié)構(gòu)或其它復(fù)合值。例如"xyz:Order"結(jié)構(gòu)數(shù)組:
    <SOAP-ENC:Array SOAP-ENC:arrayType="xyz:Order[2]">
    <Order>
    <Product>Apple</Product>
    <Price>1.56</Price>
    </Order>
    <Order>
    <Product>Peach</Product>
    <Price>1.48</Price>
    </Order>
    </SOAP-ENC:Array>
    數(shù)組成員值也可以是數(shù)組。下例是兩個(gè)字符串?dāng)?shù)組組成的數(shù)組:
    <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[][2]">
    <item href="#array-1"/>
    <item href="#array-2"/>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="array-1" SOAP-ENC:arrayType="xsd:string[2]">
    <item>r1c1</item>
    <item>r1c2</item>
    <item>r1c3</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="array-2" SOAP-ENC:arrayType="xsd:string[2]">
    <item>r2c1</item>
    <item>r2c2</item>
    </SOAP-ENC:Array>
    包含數(shù)組的元素?zé)o需命名為"SOAP-ENC:Array"。它可以有任意的名,只要元素的類型是SOAP-ENC:Array或由之衍生的類型。例如,下面是一個(gè)schema片斷和與之一致的數(shù)組實(shí)例。
    <simpleType name="phoneNumber" base="string"/>
    <element name="ArrayOfPhoneNumbers">
    <complexType base="SOAP-ENC:Array">
    <element name="phoneNumber" type="tns:phoneNumber" maxOccurs="unbounded" />
    </complexType>
    <anyAttribute/>
    </element>
    <xyz:ArrayOfPhoneNumbers SOAP-ENC:arrayType="xyz:phoneNumber[2]">
    <phoneNumber>206-555-1212</phoneNumber>
    <phoneNumber>1-888-123-4567</phoneNumber>
    </xyz:ArrayOfPhoneNumbers>
    數(shù)組可能是多維的。在這種情況下,在arrayType屬性的asize部分將不止有一個(gè)值:
    <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[2,3]">
    <item>r1c1</item>
    <item>r1c2</item>
    <item>r1c3</item>
    <item>r2c1</item>
    <item>r2c2</item>
    <item>r2c3</item>
    </SOAP-ENC:Array>
    雖然上面的例子把數(shù)組編碼為獨(dú)立的元素,但元素值也可以是嵌入形式,而且若元素值是single reference時(shí),必須編碼為嵌入形式。下例是一個(gè)schema片斷,電話號(hào)碼數(shù)組嵌入到一個(gè)類型為"Person"的結(jié)構(gòu)中,并且通過accessor "phone-numbers"訪問它:
    <simpleType name="phoneNumber" base="string"/>
    <element name="ArrayOfPhoneNumbers">
    <complexType base="SOAP-ENC:Array">
    <element name="phoneNumber" type="tns:phoneNumber" maxOccurs="unbounded"/>
    </complexType>
    <anyAttribute/>
    </element>
    <element name="Person">
    <complexType>
    <element name="name" type="string"/>
    <element name="phoneNumbers" type="tns:ArrayOfPhoneNumbers"/>
    </complexType>
    </element>
    <xyz:Person>
    <name>John Hancock</name>
    <phoneNumbers SOAP-ENC:arrayType="xyz:phoneNumber[2]">
    <phoneNumber>206-555-1212</phoneNumber>
    <phoneNumber>1-888-123-4567</phoneNumber>
    </phoneNumbers>
    </xyz:Person>
    下面的例子中,數(shù)組值為single-reference,被編碼為嵌入元素,包含它的元素名即為入口名:
    <xyz:PurchaseOrder>
    <CustomerName>Henry Ford</CustomerName>
    <ShipTo>
    <Street>5th Ave</Street>
    <City>New York</City>
    <State>NY</State>
    <Zip>10010</Zip>
    </ShipTo>
    <PurchaseLineItems SOAP-ENC:arrayType="Order[2]">
    <Order>
    <Product>Apple</Product>
    <Price>1.56</Price>
    </Order>
    <Order>
    <Product>Peach</Product>
    <Price>1.48</Price>
    </Order>
    </PurchaseLineItems>
    </xyz:PurchaseOrder>

    5.4.2.1 部分儲(chǔ)值(partially transmitted)數(shù)組
    SOAP提供了對(duì)部分儲(chǔ)值(partially transmitted)數(shù)組的支持,如某些上下文中的可變數(shù)組。一個(gè)partially transmitted 數(shù)組由一個(gè)"SOAP-ENC:offset"屬性(從第一個(gè)transmitted的元素開始的偏移量,基于0)指示。如果省略,偏移量取0。下面的例子中數(shù)組的大小為5,但只有從0起,第三和第四個(gè)元素被儲(chǔ)值。
    <SOAP-ENC:Array ;SOAP-ENC:arrayType="xsd:string[5]" ;SOAP-ENC:offset="[2]">
    <item>The third element</item>
    <item>The fourth element</item>
    </SOAP-ENC:Array>
    5.4.2.2 稀疏數(shù)組Sparse Arrays
    SOAP提供了對(duì)稀疏數(shù)組的支持。每個(gè)表示成員值的元素包含一個(gè)"SOAP-ENC:position"屬性,用來指示它在數(shù)組中的位置。下例是兩維字符串稀疏數(shù)組的例子,數(shù)組大小是4,但只用到第2個(gè)。
    <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[,][4]">
    <SOAP-ENC:Array href="#array-1" SOAP-ENC:position="[2]"/>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="array-1" SOAP-ENC:arrayType="xsd:string[10,10]">
    <item SOAP-ENC:position="[2,2]">Third row, third col</item>
    <item SOAP-ENC:position="[7,2]">Eighth row, third col</item>
    </SOAP-ENC:Array>
    如果對(duì)array-1的引用僅發(fā)生在數(shù)組內(nèi)部,上例也可以編碼如下:
    <SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[,][4]">
    <SOAP-ENC:Array SOAP-ENC:position="[2]" SOAP-ENC:arrayType="xsd:string[10, 10]>
    <item SOAP-ENC:position="[2,2]">Third row, third col</item>
    <item SOAP-ENC:position="[7,2]">Eighth row, third col</item>
    </SOAP-ENC:Array>
    </SOAP-ENC:Array>
    5.4.3 一般復(fù)合類型
    在這里提到的編碼規(guī)則不僅僅限于accessor名已知的情況,如果accessor名是運(yùn)行環(huán)境下實(shí)時(shí)獲得的,編碼規(guī)則同樣適用,也就是說accessor編碼成一個(gè)元素名與accessor名匹配的元素,同時(shí)accessor可能包含或者引用該元素的值。如果accessor包含類型不能事先確定的值,它必須包含一個(gè)合適的屬性xsi:type 。類似地,上述引用的規(guī)則已經(jīng)足夠用于復(fù)合類型的序列化,這些復(fù)合類型可能包含用名區(qū)分的accessors(結(jié)構(gòu))和用名及序數(shù)位置區(qū)分的accessors。(可能包含重復(fù)的accessor) 實(shí)際上這并不要求任何schema模式包含這些類型,但更為準(zhǔn)確的說法是:一個(gè)類型模型(type-model)schema如果有這些類型,就可以構(gòu)造一個(gè)符合XML句法規(guī)則的schema和XML文檔實(shí)例。
    <xyz:PurchaseOrder>
    <CustomerName>Henry Ford</CustomerName>
    <ShipTo>
    <Street>5th Ave</Street>
    <City>New York</City>
    <State>NY</State>
    <Zip>10010</Zip>
    </ShipTo>
    <PurchaseLineItems>
    <Order>
    <Product>Apple</Product>
    <Price>1.56</Price>
    </Order>
    <Order>
    <Product>Peach</Product>
    <Price>1.48</Price>
    </Order>
    </PurchaseLineItems>
    </xyz:PurchaseOrder>
    類似地,將一個(gè)結(jié)構(gòu)上類似數(shù)組但實(shí)際上不是一個(gè) SOAP-ENC:Array類型或者 SOAP-ENC:Array子類型的復(fù)合值序列化同樣是允許的,例如:
    <PurchaseLineItems>
    <Order>
    <Product>Apple</Product>
    <Price>1.56</Price>
    </Order>
    <Order>
    <Product>Peach</Product>
    <Price>1.48</Price>
    </Order>
    </PurchaseLineItems>
    5.5 缺省值
    省略accessor元素意味著或者有一個(gè)缺省值或者值不知道。具體細(xì)節(jié)依靠這個(gè)accessor,方法和上下文。例如,對(duì)于多態(tài)accessor,省略accessor一般意味著一個(gè)Null值。同樣,省略布爾accessor一般意味著False值或者值不知道,省略數(shù)字accessor一般意味著值為零或者值不知道。
    5.6 SOAP root屬性
    SOAP root 屬性可用于標(biāo)記一個(gè)序列化root,從而一個(gè)對(duì)象可以反序列化(deserialized),而實(shí)際上該root并不是真正的對(duì)象root。這個(gè)屬性有兩個(gè)可選值"1" or "0"。對(duì)象真正的roots屬性值為“1” ,序列化root但不是真正的root屬性值也為“1”,元素如果要顯式地指定不能為序列化root,只需將該屬性設(shè)置為“0” SOAP root屬性可以出現(xiàn)在SOAP頭和SOAP體元素的任意子元素中。(譯者注:SOAP root屬性為0的元素不是一個(gè)獨(dú)立的實(shí)體,外部的應(yīng)用不能訪問到該元素,但該元素可以被SOAP文檔本身的其它元素訪問到)SOAP root屬性可以出現(xiàn)在SOAP頭和SOAP體元素的任意子元素中。這個(gè)屬性沒有缺省值。
    6. 在HTTP中使用SOAP
    這一節(jié)講述了如何在HTTP中使用SOAP。把SOAP綁定到HTTP,無論使用或不用HTTP擴(kuò)展框架,都有很大的好處:在利用SOAP的形式化和靈活性的同時(shí),使用HTTP種種豐富的特性。在HTTP中攜帶SOAP消息,并不意味著SOAP改寫了HTTP已有的語義,而是將構(gòu)建在HTTP之上SOAP語義自然地對(duì)應(yīng)到HTTP語義。SOAP自然地遵循HTTP的請(qǐng)求/應(yīng)答消息模型使得SOAP的請(qǐng)求和應(yīng)答參數(shù)可以包含在HTTP請(qǐng)求和應(yīng)答中。注意,SOAP的中間節(jié)點(diǎn)與HTTP的中間節(jié)點(diǎn)并不等同,即,不要期望一個(gè)根據(jù)HTTP連接頭中的域?qū)ぶ返降腍TTP中間節(jié)點(diǎn)能夠檢查或處理HTTP請(qǐng)求中的SOAP消息。
    在HTTP消息中包含SOAP實(shí)體時(shí),按照RFC2376[3] HTTP應(yīng)用程序必須使用媒體類型 "text/xml"。
    6.1 SOAP HTTP請(qǐng)求
    雖然SOAP可能與各種HTTP請(qǐng)求方式相結(jié)合,但是綁定僅定義了在HTTP POST請(qǐng)求中包含SOAP消息。(第7節(jié)中描述了如何在RPC中使用SOAP,第6.3節(jié)描述了如何使用HTTP擴(kuò)展框架)
    6.1.1 HTTP頭中SOAPAction域
    一個(gè)HTTP請(qǐng)求頭中的SOAPAction域用來指出這是一個(gè)SOAP HTTP請(qǐng)求,它的值是所要的URI。在格式、URI的特性和可解析性上沒有任何限制。當(dāng)HTTP客戶發(fā)出SOAP HTTP請(qǐng)求時(shí)必須使用在HTTP頭中使用這個(gè)域。
    soapaction = "SOAPAction" ":" [ <"> URI-reference <"> ]
    URI-reference = <as defined in RFC 2396 [4]>
    HTTP頭中SOAPAction域使服務(wù)器(如防火墻)能正確的過濾HTTP中SOAP請(qǐng)求消息。如果這個(gè)域的值是空字符串(""),表示SOAP消息的目標(biāo)就是HTTP請(qǐng)求的URI。這個(gè)域沒有值表示沒有SOAP消息的目標(biāo)的信息。例子:
    SOAPAction: "http://electrocommerce.org/abc#MyMessage"
    SOAPAction: "myapp.sdl"
    SOAPAction: ""
    SOAPAction:
    6.2 SOAP HTTP應(yīng)答
    SOAP HTTP遵循HTTP 中表示通信狀態(tài)信息的HTTP狀態(tài)碼的語義。例如,2xx狀態(tài)碼表示這個(gè)包含了SOAP組件的客戶請(qǐng)求已經(jīng)被成功的收到,理解和接受。在處理請(qǐng)求時(shí)如果發(fā)生錯(cuò)誤,SOAP HTTP服務(wù)器必須發(fā)出應(yīng)答HTTP 500 "Internal Server Error",并在這個(gè)應(yīng)答中包含一個(gè)SOAP Fault元素(見4.4節(jié))表示這個(gè)SOAP處理錯(cuò)誤。
    6.3 HTTP擴(kuò)展框架
    一個(gè)SOAP消息可以與HTTP擴(kuò)展框架 [6]一起使用以區(qū)分是否有SOAP HTTP請(qǐng)求和它的目標(biāo)。是使用擴(kuò)展框架或是普通的HTTP關(guān)系到通信各方的策略和能力。通過使用一個(gè)必需的擴(kuò)展聲明和"M-"HTTP方法名前綴,客戶可以強(qiáng)制使用HTTP擴(kuò)展框架。服務(wù)器可以使用HTTP狀態(tài)碼510 "Not Extended"強(qiáng)制使用HTTP擴(kuò)展框架。也就是說,使用一個(gè)額外的來回,任何一方都可以發(fā)現(xiàn)另一方的策略并依照?qǐng)?zhí)行。用來表示SOAP使用了擴(kuò)展框架的擴(kuò)展標(biāo)志符是:http://schemas.xmlsoap.org/soap/envelope/
    6.4 SOAP HTTP舉例
    例3 使用POST的SOAP HTTP
    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 使用擴(kuò)展框架的SOAP HTTP
    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...
    HTTP/1.1 200 OK

    Ext:
    Content-Type: text/xml; charset="utf-8"
    Content-Length: nnnn
    <SOAP-ENV:Envelope...
    7. 在RPC中使用SOAP
    設(shè)計(jì)SOAP的目的之一就是利用XML的擴(kuò)展性和靈活性來封裝和交換RPC調(diào)用。這一節(jié)定義了遠(yuǎn)程過程調(diào)用和應(yīng)答的統(tǒng)一表示形式。雖然可以預(yù)計(jì)到這種表示形式最可能被用于與第5節(jié)中定義的編碼方式相結(jié)合,但也可能有其它的表示形式。SOAP的encodingStyle屬性(見4.3.2節(jié))可以用來表明方法調(diào)用和應(yīng)答都使用這一節(jié)所指定的表示方式。在RPC中使用SOAP和SOAP協(xié)議綁定(見第6節(jié))是緊密相關(guān)的。在使用HTTP作為綁定協(xié)議時(shí),一個(gè)RPC調(diào)用自然地映射到一個(gè)HTTP請(qǐng)求,RPC應(yīng)答同樣映射到HTTP應(yīng)答。但是,在RPC中使用SOAP并不限于綁定HTTP協(xié)議。
    要進(jìn)行方法調(diào)用,以下的信息是必需的:
    ·      目標(biāo)對(duì)象的URI
    ·      方法名
    ·      方法signature(可選)
    ·      方法的參數(shù)
    ·      頭數(shù)據(jù)(可選)
    SOAP依靠協(xié)議綁定提供傳送URI的機(jī)制。例如,對(duì)HTTP來說,請(qǐng)求的URI指出了調(diào)用的來源 。除了必須是一個(gè)合法的URI之外,SOAP對(duì)一個(gè)地址的格式?jīng)]有任何限制。(更多URI的信息參見 [4])
    7.1 RPC和SOAP體
    RPC方法調(diào)用和應(yīng)答都包含在SOAP Body元素中(見4.3節(jié)),它們使用如下的表示形式:
    ·      一個(gè)方法調(diào)用用一個(gè)結(jié)構(gòu)表示
    ·      一個(gè)方法調(diào)用被看作一個(gè)單個(gè)的結(jié)構(gòu),每個(gè)[in]和[in/out]參數(shù)有一個(gè)accessor。結(jié)構(gòu)的名和類型與方法相同。每個(gè)[in]和[in/out]參數(shù)都被看作一個(gè)accessor,這個(gè)accessor的名和類型與參數(shù)的名和類型相對(duì)應(yīng)。它們的出現(xiàn)順序和方法中定義的參數(shù)順序相同。
    ·      一個(gè)方法應(yīng)答用一個(gè)結(jié)構(gòu)表示。
    ·      一個(gè)方法應(yīng)答被看作一個(gè)單個(gè)的結(jié)構(gòu),返回值和每個(gè)[in]和[in/out]參數(shù)有一個(gè)accessor。第一個(gè)accessor是返回值,之后是參數(shù)accessor,參數(shù)accessor的出現(xiàn)順序和方法中定義的參數(shù)順序相同。每個(gè)參數(shù)accessor的名稱和類型與參數(shù)的名稱和類型相對(duì)應(yīng)。返回值accessor的名稱并不重要。同樣,結(jié)構(gòu)的名稱也不重要,不過,通常在方法名稱的后面加上字符串"Response"作為結(jié)構(gòu)的名稱。
    方法錯(cuò)誤使用SOAP Fault元素(見4.4節(jié))表示。如果綁定的協(xié)議有額外的規(guī)則表示錯(cuò)誤,則這些規(guī)則也必須要遵從。正如上面所述,方法調(diào)用和應(yīng)答結(jié)構(gòu)可以按照第5節(jié)中規(guī)則編碼,或者用encodingStyle屬性(見4.1.1節(jié))指定編碼方式。應(yīng)用程序可以處理缺少參數(shù)的請(qǐng)求,但是可能返回一個(gè)錯(cuò)誤。因?yàn)榉祷亟Y(jié)果表示調(diào)用成功,錯(cuò)誤表示調(diào)用失敗,所以,在方法應(yīng)答中同時(shí)包含返回結(jié)果和錯(cuò)誤是錯(cuò)誤的。
    7.2 RPC和SOAP頭
    在RPC編碼中,可能會(huì)有與方法請(qǐng)求有關(guān)但不是正規(guī)的方法signature的附加信息。如果這樣,它必須作為SOAP頭元素的子元素。使用這種頭元素的一個(gè)例子是在消息中傳遞事務(wù)ID。由于事務(wù)ID不是方法signature的一部分,通常由底層的組件而不是應(yīng)用程序代碼控制,所以沒有一種直接的方法在調(diào)用中傳遞這個(gè)必要的信息。通過在頭中添加一個(gè)給定名字的條目,接收方的事務(wù)管理器就可以析取這個(gè)事務(wù)ID,而且不影響遠(yuǎn)程過程調(diào)用的代碼。
    8. 安全性考慮
    這篇文檔中沒有涉及完整性和保密性,這些問題將在以后的版本中描述。
    9. 參考文獻(xiàn)
    [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", RFC 2119, 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): Generic Syntax", RFC 2396, MIT/LCS, U.C.Irvine, Xerox Corporation, A ugust 1998.
    [5] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, T. Berners-Lee, "Hypert ext 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 Recommendation "The XML Specification"
    [8] W3C Recommendation "Namespaces in XML"
    [9] W3C Working Draft "XML Linking Language". This is work in progress.
    [10] W3C Working Draft "XML Schema Part 1: Structures". This is work in progress.
    [11] W3C Working Draft "XML Schema Part 2: Datatypes". This is work in progress.
    [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 Virtu al, November 1996
    10。 附錄
    A. SOAP封裝舉例
    A.1 請(qǐng)求編碼舉例
    例5 類似于例1,但有一個(gè)必要的頭
    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,但有多個(gè)請(qǐng)求參數(shù)
    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>
    A.2 應(yīng)答編碼舉例
    例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類似,但有一個(gè)結(jié)構(gòu)
    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類似,但處理必要的頭出錯(cuò)
    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類似,但處理Body出錯(cuò)
    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>
    posted on 2008-09-26 11:47 阿蜜果 閱讀(1208) 評(píng)論(0)  編輯  收藏 所屬分類: 網(wǎng)絡(luò)通信相關(guān)
    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

          生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 99久久人妻精品免费二区| 国产午夜成人免费看片无遮挡| 免费无码专区毛片高潮喷水| jizz免费一区二区三区| 国内精品免费在线观看 | 理论亚洲区美一区二区三区| 日本一区二区在线免费观看| 国产免费无码一区二区| 1024免费福利永久观看网站| 日韩一级免费视频| 亚洲美女又黄又爽在线观看| 亚洲男女一区二区三区| 理论亚洲区美一区二区三区| 日韩精品无码免费专区午夜不卡| 人与禽交免费网站视频| 四虎永久在线精品免费观看地址| 久久被窝电影亚洲爽爽爽| 最新国产成人亚洲精品影院| 成人免费观看男女羞羞视频| 69国产精品视频免费| 天堂亚洲免费视频| 亚洲成人中文字幕| 国产精品日本亚洲777| 久久国产精品免费网站| 国产青草视频在线观看免费影院| 亚洲国产成人片在线观看| 亚洲最大无码中文字幕| 日韩a级无码免费视频| 免费看片A级毛片免费看| 亚洲国产精品无码成人片久久 | 亚洲色偷偷偷网站色偷一区| 美女视频黄.免费网址| 中文字幕免费在线观看| 亚洲av无码天堂一区二区三区| 亚洲视频在线观看视频| 永久免费观看黄网站| 毛片a级毛片免费观看品善网| 亚洲美女又黄又爽在线观看| 亚洲av永久中文无码精品| 亚洲视频在线免费观看| 亚洲国产精品第一区二区三区|