国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

SOAP協議規范(一)

2024-07-21 02:29:12
字體:
來源:轉載
供稿:網友

最大的網站源碼資源下載站,

soap協議規范
1.  簡介  
soap以xml形式提供了一個簡單、輕量的用于在分散或分布環境中交換結構化和類型信息的機制。soap本身并沒有定義任何應用程序語義,如編程模型或特定語義的實現;實際上它通過提供一個有標準組件的包模型和在模塊中編碼數據的機制,定義了一個簡單的表示應用程序語義的機制。這使soap能夠被用于從消息傳遞到rpc的各種系統。  

soap包括三個部分  

soap封裝(見第4節)結構定義了一個整體框架用來表示消息中包含什么內容,誰來處理這些內容以及這些內容是可選的或是必需的。
soap編碼規則(見第5節)定義了用以交換應用程序定義的數據類型的實例的一系列機制。
soap  rpc表示(見第7節)定義了一個用來表示遠程過程調用和應答的協定。
雖然這三個部分都作為soap的一部分一起描述,但它們在功能上是相交的。特別的,封裝和編碼規則是在不同的名域中定義的,這種模塊性的定義方法增加了簡單性在soap封裝,soap編碼規則和soaprpc協定之外,這個規范還定義了兩個協議的綁定,描述了在有或沒有http擴展框架[6]的情況下,soap消息如何包含在http消息[5]中被傳送。  

1.1  設計目標
soap的主要設計目標是簡單性和可擴展性,這意味著傳統的消息系統和分布對象系統的某些性質不是soap規范的一部分。這些性質包括:  

分布式碎片收集
成批傳送消息
對象引用(要求分布式碎片收集)
激活機制(要求對象引用)
1.2  符號約定
這篇文章中的關鍵字  "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/";關聯。整篇文檔中,名域前綴“xsi”被假定為與uri"http://www.w3.org/1999/xmlschema-instance“(在xmlschema規范[11]定義)相連。類似的,名域前綴”xsd“被假定為與uri"http://www.w3.org/1999/xmlschema";(在[10]中定義)相連。名域前綴”tns“用來表示任意名域。所有其它的名域前綴都只是例子。
名域uri的基本形式”some-uri“表示某些依賴于應用程序或上下文的uri[4]。這個規范用擴展bnf(在rfc-2616[5]  描述)描述某些結構。  

1.3  soap消息舉例
在這個例子中,getlasttradeprice  soap  請求被發往stockquote服務。這個請求攜帶一個字符串參數和ticker符號,在soap應答中返回一個浮點數。xml名域用來區分soap標志符和應用程序特定的標志符。這個例子說明了在第6節中定義的http綁定。如果soap中管理xml負載的規則完全獨立于http是沒有意義的,因為事實上該負載是由http攜帶的。在appendix  a中有更多的例子。  

例1  在http請求中嵌入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:encoding_blank" encoding>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消息  

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:encoding_blank" encoding>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消息從發送方到接收方是單向傳送,但正如上面顯示的,soap消息經常以請求/應答的方式實現。soap實現可以通過開發特定網絡系統的特性來優化。例如,http綁定(見第6節)使soap應答消息以http應答的方式傳輸,并使用同一個連接返回請求。不管soap被綁定到哪個協議,soap消息采用所謂的”消息路徑“發送,這使在終節點之外的中間節點可以處理消息。一個接收soap消息的soap應用程序必須按順序執行以下的動作來處理消息:識別應用程序想要的soap消息的所有部分  (見4.2.2節)檢驗應用程序是否支持第一步中識別的消息中所有必需部分并處理它。如果不支持,則丟棄消息(見4.4節)。在不影響處理結果的情況下,處理器可能忽略第一步中識別出的可選部分。如果這個soap應用程序不是這個消息的最終目的地,則在轉發消息之前刪除第一步中識別出來的所有部分。為了正確處理一條消息或者消息的一部分,soap處理器需要理解:所用的交換方式(單向,請求/應答,多路發送等等),這種方式下接收者的任務,rpc機制(如果有的話)的使用(如第7節中所述),數據的表現方法或編碼,還有其它必需的語義。盡管屬性(比如soap  encodingstyle,見4.1.1節)可以用于描述一個消息的某些方面,但這個規范并不  強制所有的接收方也必須有同樣的屬性并取同樣的屬性值。舉個例子,某一特定的應用可能知道一個元素表示一條遵循第7節約定的rpc請求,但是另外一些應用可能認為指向該元素的所有消息都用單向傳輸,而不是類似第7節的請求應答模式。
(譯者注:交互雙方的soap消息并不一定要遵循同樣的格式設定,而只需要以一種雙方可理解的格式交換信息就可以了)  

3.  與xml的關系
所有的soap消息都使用xml形式編碼(更多有關xml的信息請見[7])一個soap應用程序產生的消息中,所有由soap定義的元素和屬性中必須包括正確的名域。soap應用程序必須能夠處理它接收到的消息中的soap名域(見4.4節),并且它可以處理沒有soap名域的soap消息,就象它們有正確的名域一樣。soap定義了兩個名域(更多有關xml名域的信息請見[8])  

soap封裝的名域標志符是"http://schemas.xmlsoap.org/soap/envelope/";
soap的編碼規則的名域標志符是"http://schemas.xmlsoap.org/soap/encoding/";
soap消息中不能包含文檔類型聲明,也不能包括消息處理指令。[7]  soap使用"id"類型"id"屬性來指定一個元素的唯一的標志符,同時該屬性是局部的和無需校驗的。soap使用"uri-reference"類型的"href"屬性指定對這個值的引用,同時該屬性是局部的和無需校驗的。這樣就遵從了xml規范[7],xmlschema規范[11]和xml連接語言規范[9]的風格。除了soap  mustunderstand  屬性(見4.2.3節)和soapactor屬性(見4.2.2節)之外,一般允許屬性和它們的值出現在xml文檔實例或schema中(兩者效果相同)。也就是說,在dtd或schema中聲明一個缺省值或固定值和在xml文檔實例中設置它的值在語義上相同。  

4.  soap封裝
soap消息是一個xml文檔,包括一個必需的soap封裝,一個可選的soap頭和一個必需的soap體。在這篇規范剩余部分中,提到soap消息時就是指這個xml文檔。這一節中定義的元素和屬性的名域標志符為:  

"http://schemas.xmlsoap.org/soap/envelope/";  。一個soap消息包括以下部分:1.在表示這個消息的xml文檔中,封裝是頂層元素。2.應用soap交換信息的各方是分散的且沒有預先協定,soap頭提供了向soap消息中添加關于這條soap消息的某些要素(feature)的機制。soap定義了少量的屬性用來表明這項要素(feature)是否可選以及由誰來處理。(見4.2節)3.soap體是包含消息的最終接收者想要的信息的容器(見4.3節)。soap為soap體定義了一個fault元素用來報告錯誤信息。語法規則如下所示:  

封裝  

元素名是  "envelope"
在soap消息中必須出現。
可以包含名域聲明和附加屬性。如果包含附加屬性,這些屬性必須限定名域。類似的,"envelope"可以包含附加子元素,這些也必須限定名域且跟在soap體元素之后。
soap頭  (見4.2節)  

元素名是"header"
在soap消息中可能出現。如果出現的話,必須是soap封裝元素的第一個直接子元素。
soap頭可以包含多個條目,每個都是soap頭元素的直接子元素。所有soap頭的直接子元素都必須限定名域。
soap體  (見4.3節)  

元素名是"body"
在soap消息中必須出現且必須是soap封裝元素的直接子元素。它必須直接跟在soap頭元素(如果有)之后。否則它必須是soap封裝元素的第一個直接子元素。
soap體可以包括多個條目,每個條目必須是soap體元素的直接子元素。soap體元素的直接子元素可以限定名域。soap定義了soapfault元素來表示錯誤信息。
4.1.1  soap  encodingstyle屬性
encodingstyle全局屬性用來表示soap消息的序列化規則。這個屬性可以在任何元素中出現,作用范圍與名域聲明的作用范圍很相似,為這個元素的內容和它的所有沒有重載此屬性的子元素。soap消息沒有定義缺省編碼。屬性值是一個或多個uri的順序列表,每個uri確定了一種或多種序列化規則,用來不同程度反序列化soap消息,舉例如下:  

"http://schemas.xmlsoap.org/soap/encoding/";
"http://my.host/encoding/restrictedhttp://my.host/encoding/";
""  

第5節中定義的序列化規則由uri"http://schemas.xmlsoap.org/soap/encoding/";  確定。使用這個特定序列化規則的消息應該用encodingstyle屬性說明這一點。另外,所有以"http://schemas.xmlsoap.org/soap/encoding/";開頭的uri中的序列化規則與第5節中定義的soap編碼規則相一致。一個零長度的uri("")明確顯示所含元素沒有任何編碼形式。這可以用來取消上一級元素的所有編碼聲明。  

4.1.2  封裝版本模型
soap沒有定義常規的基于主版本號和輔版本號的版本形式。soap消息必須有一個封裝元素與名域"http://schemas.xmlsoap.org/soap/envelope/";關聯。如果soap應用程序接收到的soap消息中的soap封裝元素與其他的名域關聯,則視為版本錯誤,應用程序必須丟棄這個消息。如果消息是通過http之類的請求/應答協議收到的,應用程序必須回答一個soap  versionmismatch  錯誤信息(見4.4節)。  

4.2  soap頭
soap為相互通信的團體之間提供了一種很靈活的機制:在無須預先協定的情況下,以分散但標準的方式擴展消息??梢栽趕oap頭中添加條目實現這種擴展,典型的例子有認證,事務管理,支付等等。頭元素編碼為soap封裝元素的第一個直接子元素。頭元素的所有直接子元素稱作條目。條目的編碼規則如下:  

一個條目有它的完整的元素名(包括名域uri和局部名)確定。soap頭的直接子元素必須有名域限制。
soap  encodingstyle屬性可以用來指示條目所用的編碼形式(見4.1.1節)
soap  mustunderstand屬性(見4.2.3節)和soapactor屬性(見4.2.2節)可以用來指示如何處理這個條目以及由誰來處理。(見4.2.1節)  

4.2.1  使用頭屬性
這一節中定義的soap頭屬性確定了soap消息的接收者應該怎樣按第2節中所述的方式處理消息。產生soap消息的soap應用程序,應該僅僅在soap頭元素的直接子元素中使用這些soap頭屬性。soap消息的接收者必須忽略所有不在soap頭元素的直接子元素中soap頭屬性。下面的例子是一個soap頭,包括一個元素標志符"transaction","mustunderstand"取值為"1"和數值5。這應該以如下方式編碼:  

<soap-env:header>
<t:transaction
xmlns:t="some-uri"  soap-env:mustunderstand="1">
5
</t:transaction>
</soap-env:header>  

4.2.2  soap  actor屬性
一個soap消息從始節點到終節點的過程中,可能沿著消息路徑經過一系列soap中間節點。一個soap中間節點是一個可以接收轉發soap消息的應用程序。中間節點和終節點由uri區分??赡躶oap消息的終節點并不需要所有部分,而在消息路徑上的一個和幾個中間節點可能需要這些內容。頭元素的接收者扮演的角色類似于一個過濾器,防止這些只發給本接受者的消息部分擴散到其它節點。即一個頭元素的接收者必須不轉發這些頭元素到soap消息路徑上的下一個應用程序。同樣的,接收者可能插入一個相似的頭元素。soap  actor全局屬性可以用于指示頭元素的接收者。soap  actor屬性的值是一個uri。  

uri  "http://schemas.xmlsoap.org/soap/actor/next";指出了第一個處理這個消息的soap應用程序需要這個頭元素。這類似于http頭中用connection域表示hop-by-hop范圍模型。省略soap  actor屬性表示接收者是soap消息的終節點。如果這個屬性要生效,它必須出現在soap消息實例中。(見第3節和4.2.1節)  

4.2.3  soap  mustunderstand屬性
soap  mustunderstand全局屬性用來指示接受者在處理消息時這個條目是否必須處理。條目的接收者由soap  actor屬性定義(見4.2.2節)。mustunderstand屬性的值是"1"  或  "0"。缺少soap  mustunderstand屬性在語義上等同于它的值為"0"。如果一個頭元素的soap  mustunderstand屬性的值是"1",那么條目的接受者必須或者遵守語義(如以元素的全名傳送)并按照語義正確的處理,或者放棄處理消息(見4.4節)。soap  mustunderstand  屬性考慮了消息演變的準確性(robust  evolution)。必須假定包含soap  mustunderstand屬性且值為"1"的元素以某種方式修改了它們的父元素或同層元素的語義。以這種方式連接元素確保了語義上的變化不會被那些不能完全理解它的接收者忽略。如果這個屬性要生效,它必須出現在soap消息實例中。(見第3節和4.2.1節)  

4.3  soap體
soap體元素提供了一個簡單的機制,使消息的最終接收者能交換必要的信息。使用體元素的典型情況包括配置rpc請求和錯誤報告。體元素編碼為soap封裝元素的直接子元素。如果已經有一個頭元素,那么體元素必須緊跟在頭元素之后,否則它必須是soap封裝元素的第一個直接子元素。體元素的所有直接子元素稱作體條目,每個體條目在soap體元素中編碼為一個獨立的元素。條目的編碼規則如下:  

一個條目由它的元素全名(包括名域uri和局部名)確定。soap體元素的直接子元素可能是名域限制的。
soap  encodingstyle屬性可能用來指示條目(見4.1.1節)的編碼方式。
soap定義了一個fault條目用來報告錯誤信息。(見4.4節)
4.3.1  soap頭和體的關系
雖然頭和體定義為獨立的元素,它們實際上是有關系的。體條目和頭條目的關系如下:體條目在語義上等同于actor屬性為缺省值且mustunderstand屬性值為"1"的頭條目。不使用actor屬性則表示缺省的actor。(見4.2.2節)  

4.4  soap錯誤
soap錯誤元素用于在soap消息中攜帶錯誤和(或)狀態信息。如果有soap錯誤元素,它必須以以體條目的方式出現,并且在一個體元素中最多出現一次。soap錯誤元素定義了以下四個子元素:

faultcode
faultcode元素給軟件提供了一個識別此錯誤的算法機制。soap錯誤元素必須有faultcode子元素,并且它的值必須是一個合法的名(在[8]節定義)。soap定義一些soap  faultcode描述基本的soap錯誤(見4.4.1節)。
faultstring
faultstring元素提供了一個錯誤解釋,而不是為了軟件處理。faultstring元素類似于http中定義(見[5],第6.1節)的'reason-phrase'。soap錯誤元素必須有faultstring子元素,并且它應該提供一些錯誤本質的解釋信息。
faultactor
faultactor元素提供了在消息路徑上是誰導致了錯誤發生的信息(見第2節)。它類似于soap  actor屬性(見4.2.2節),只是soap  actor指的是頭條目的目的地,faultactor指的是錯誤的來源。faultactor屬性的值是用來區分錯誤來源的uri。不是soap消息的最終目的地的應用程序必須在soap  fault元素中包含faultactor元素。消息的最終目的地可以使用faultactor元素明確的指示是它產生了這個錯誤(參見下面的detail元素)
detail
detail元素用來攜帶與body元素有關的應用程序所要的錯誤信息。如果body元素的內容不能被成功的處理,則必須包含detail子元素。它不能用來攜帶屬于頭條目的錯誤信息。頭條目的詳細出錯信息必須由頭條目攜帶。fault元素中沒有detail元素表示這個錯誤與body元素的處理無關。在有錯誤的時候,這可以用來區分body元素有沒有被正確的處理。detail元素的所有直接子元素稱作detail條目,并且每個detail條目在detail元素中編碼為獨立的元素。detail條目的編碼規則如下(參見例10):  一個detail條目由它的元素全名(包括名域uri和局部名)確定。soap體元素的直接子元素可能是名域限制的。soap  encodingstyle屬性可能用來指示detail條目(見4.1.1節)的編碼方式。也可以有其它的fault子元素,只要它們是名域限制的。
4.4.1  soap  錯誤代碼
在描述這個規范中定義的錯誤時,這一節中定義的faultcode值必須用在faultcode元素中。這些faultcode值得名域標志符為"http://schemas.xmlsoap.org/soap/envelope/";。定義這個規范之外的方法時推薦(不要求)使用這個名域。缺省的soap  faultcode值以可擴展的方式定義,允許定義新的soap  faultcode值,并與現有的faultcode值向后兼容。使用的機制類似于http中定義的1xx,  2xx,3xx等基本的狀態類(見[5]第10節),不過,它們定義為xml合法名(見  [8]  第3節  ),而不是整數。  字符"."(點)作為faultcode的分隔符,點左邊的錯誤代碼比右邊的錯誤代碼更為普通。如:  

client.authentication  

這篇文檔中定義的faultcode值是:  

名稱  含義
versionmismatch  處理方發現soap封裝元素有不合法的名域(見4.1.2節)
mustunderstand  處理方不理解或者不服從一個包含值為"1"的
mustunderstand  屬性的  soap頭元素的直接子元素。(見4.2.3節)  

client  

client錯誤類表示消息的格式錯誤或者不包含適當的正確信息。例如,消息可能缺少正確的認證和支付信息。一般地,它表示消息不能不作修改就重發。參見4.4節  

soap  fault  detail子元素的描述。  

server  

server錯誤類表示由于消息的處理過程而不是消息的內容本身使得消息消息不能正確的處理。例如,處理消息時可能要與其它處理器通信,但它沒有響應。這個消息可能在遲一點的時間處理成功。  soap  fault子元素的詳細信息參見4.4節  

5.  soap編碼
soap編碼格式基于一個簡單的類型系統,概括了程序語言,數據庫和半結構化數據等類型系統的共同特性。一個類型或者是一個簡單的(標量的)類型,或者是由幾個部分組合而成的復合類型,其中每個部分都有自己的類型。以下將詳細描述這些類型。這一節定義了類型化對象的序列化規則。它分兩個層次。首先,給定一個與類型系統的符號系統一致的schema(譯者注:這里的schema不是符合xml語法的schema,而僅僅表示廣義的用于表示消息結構的定義方式),就構造了xml語法的schema。然后,給定一個類型系統的schema和與這個schema一致的特定的值,就構造了一個xml文檔實例。反之,給定一個依照這些規則產生的xml文檔實例和初始的schema,就可以構造初始值的一個副本。這一節中定義的元素和屬性的名域標志符為"http://schemas.xmlsoap.org/soap/encoding/";。下面的例子都假定在上一層的元素中聲明了名域。
鼓勵使用這一節中描述的數據模型和編碼方式,但也可以在soap中使用其他的數據模型和編碼方式。(見4.1.1節)  

5.1  xml中的編碼類型規則
xml允許非常靈活的數據編碼方式。soap定義了一個較小的規則集合。這一節在總的層次上定義了這些編碼規則,下一節將描述特定類型的編碼規則的細節。這一節定義的編碼規則可以與第7節中所述的rpc調用和應答映射結合使用。下面的術語用來描述編碼規則:  

一個"value"是一個字符串,類型(數字,日期,枚舉等等)的名或是幾個簡單值的組合。所有的值都有特定的類型。
一個"simple  value"沒有名部分,  如特定的字符串,整數,枚舉值等等。
一個"compound  value"是相關的值的結合,如定單,股票報表,街道地址等等。在"compound  value"中,每個相關的值都潛在的以名,序數或這兩者來區分。這叫作"a  ccessor"。復合值的例子有定單和股票報表等等。數組也是復合值。在復合值中,多個accessor有相同的名是允許的,例如rdf就是這樣做的。
一個"array"是一個復合值,成員值按照在數組中的位置相互區分。
一個"struct"也是一個復合值,成員值之間的唯一區別是accessor名,accessor名互不相同。
一個"simple  type"是簡單值的類,如叫做"string"  "integer"的類,還有枚舉類等等。
一個"compound  type"是復合值的類。復合類型的例子有定單類,它們有相同的accessor名(shipto,  totalcost等),但可能會有不同的值(可能以后被設置為確定的值)。
在復合類型中,如果類型內的accessor名互不相同,但是可能與其他類型中的accessor名相同,即,accessor名加上類型名形成一個唯一的標志符,這個名叫作"局部范圍名"。如果名是直接或間接的基于uri的一部分,那么不管它出現在什么類型中,這個名本身就可以唯一標志這個accessor,這樣的名叫作"全局范圍名"。給定了schema中相關的值的序列化信息,就可能確定某些值只與某個accessor的一個實例有關。其它情況下則無法確定。當且僅當一個accessor引用一個值,這個值才能被視為"single-reference",如果有不止一個accessor引用它,那么就將它視為"multi-reference"。注意,可能一個確定的值在一個schema中是"single-reference",而在另一個schema中是"multi-reference"。在語句構成上,一個元素可能是"independent"  或  "embedded"。一個獨立的元素指出現在序列化最頂層的任何元素。所有其它元素都是嵌入元素。雖然用xsi:type屬性可以使值的結構和類型變為自描述的,但是序列化規則允許值的類型僅僅參照schema而定。這樣的schema可能使用"xml  schema  part  1:  structures"  [10]和"xml  schema  part  2:  datatypes"  [11]中描述的符號系統,也可能使用其它符號系統。注意,雖然序列化規則可以用于除了數組和結構之外的復合類型,但是許多schema僅僅包含數組和結構類型。序列化規則如下:  

所有的值以元素內容的形式表示。一個multi-reference值必須表示為一個獨立元素的內容,而一個single-reference值最好不要這樣表示(也可以這樣表示)。對于每個具有值的元素,值的類型時必須用下述三種方式之一描述:  

所屬元素實例有xsi:type屬性
所屬元素是一個有soap-enc:arraytype  屬性(該屬性可能是缺省的)的元素的子元素,或者
所屬元素的名具有特定的類型,類型可以由schema確定。
一個簡單值表示為字符數據,即沒有任何子元素。每個簡單值必須具有一個類型,這個類型或者是xml  schemas  specification,  part  2  [11]有的類型,或者具有源類型(參見5.2節)。一個復合值編碼成一個元素的序列,每個accessor用一個嵌入元素表示,該元素的元素名和accessor的名一致。如果accessor的名是局部于其所屬的類型的,則該元素的元素名不是合格的,否則對應的元素名是合格的。(參見5.4節)
一個multi-reference的簡單值或復合值編碼成一個獨立的元素,這個元素包含一個局部的無需校驗的屬性,屬性名為"id",類型為"id"(依照xml  specification  [7])。值的每個accessor對應一個空元素,該元素有一個局部的,無需校驗的屬性,屬性名為"href",類型為"  uri-reference  "(依照xml  schema  specification  [11]),"href"屬性的值引用了相對應的獨立元素的uri標志符。字符串和字符數組表示為multi-reference的簡單類型,但是特殊的規則使它們在普通的情況下能被更有效的表示(參見5.2.1節和5.2.3節)。字符串和字符數組值的accessor可能有一個名字為"id",類型為"id"(依照xml  specification  [7])的屬性。如果這樣,所有這個值的所有其它accessor編碼成一個空元素,這個元素有一個局部的,無需校驗的屬性,屬性名為"href",類型為"  uri-reference  "(依照xml  schema  specification  [11]),"href"屬性的值引用了包含這個值的元素的uri標志符。編碼時允許一個值有多個引用,就像多個不同的值有多個引用一樣,但這僅在從上下文可以知道這個xml文檔實例的含義沒有改變時才可使用。數組是復合值(參見5.4.2節)。soap數組定義為具有類型"soap-enc:array"或從它衍生的類型.  

soap數組可以時一維或多維,它們的成員以序數位置相互區分。一個數組值表示為反映這個數組的一系列元素,數組成員按升序出現。對多維數組來說,右邊的這一維變化最快。每個成員元素命名為一個獨立元素。(見規則2)soap數組可以是single-reference  或multi-reference值,因此可以表示為嵌入元素或獨立元素的內容。soap數組必須包含一個"soap-enc:arraytype"屬性,它的值指定了包含元素的類型和數組的維數。"soap-enc:arraytype"屬性的值定義如下:  

arraytypevalue  =  atype  asize
atype  =  qname  *(  rank  )
rank  =  "["  *(  ","  )  "]"
asize  =  "["  #length  "]"
length  =  1*digit  

"atype"結構是被包含元素的類型名,它表示為qname并且作為類型限制在xml元素聲明的
"type"屬性中出現(這意味著被包含元素的所有值都要與該類型一致,即在soap-enc:a  rraytype中引用的類型必須是每個數組成員的類型或超類型)。在arrays  of  arrays  or  "jagged  arrays"的情況下,類型組件編碼為"innermost"類型且在從第一層開始的嵌套數組的每一層中,類型名后都跟隨一個rank結構。多維數組編碼時從第一維起,每一維之間用逗號隔開。
"asize"結構包含一個以逗號分隔的列表,數值0,1或其它整數表示數組每一維的長度。整數0表示沒有指定詳細的大小,但是可能在檢查數組實際成員的大小后確定。例如,一個5個成員的整型數組的arraytypevalue值為"int[][5]",它的atype值是int[]",asize值是"[5]"。同樣,一個3個成員的兩維整型數組的arraytypevalue值為"int[,][3]",它的atype值是int[,]",asize值是"[3]"。
一個soap數組成員可能包含一個"soap-enc:offset"屬性表示這一項在整個數組中的位置偏移值。這被用來指示一個部分儲值數組(見5.4.2.1節)的位置偏移值。同樣,一個數組成員可能包含一個"soap-enc:position"屬性表示這一項在整個數組中的位置,這被用來描述稀疏數組(見5.4.2.2節)的成員。"soap-enc:offset"  和"soap-enc:position"屬性值的定義如下:  

arraypoint  =  "["  #length  "]"
偏移值和位置從0開始
null值或缺省值可能通過省略accssor元素來表示。null值也可能通過一個包含值為'1'的xsi:null屬性的accssor元素來表示,其它的依賴于應用程序的屬性和值也可能用來表示null值。注意,規則2允許獨立的元素和數組成員名不同于值類型的元素。  

5.2  簡單類型
soap采用了"xml  schema  part  2:  datatypes"規范[11]"built-in  datatypes"節中的所有類型作為簡單類型,包括值和取值范圍。例如:  

類型  舉例
int  58502
float  314159265358979e+1
negativeinteger  -32768
string  louis  "satchmo"  armstrong  

在xml  schema規范中聲明的數據類型可以直接用在元素schema中,也可以使用從這些類型衍生的新類型。一個schema和對應的具有這些類型的元素的數據實例的例子如下所示:  

<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>  

所有簡單值必須編碼為元素的內容,它的類型或者在"xml  schema  part  2:  datatypes"規范[11]中定義過,或者是基于一個用xml  schema規范提供的機制能推衍生出的類型。如果一個簡單值編碼為獨立元素或異質數組成員,那么有一個對應于數據類型的元素聲明將會很方便。因為"xml  schema  part  2:  datatypes"規范[11]包括了類型定義,但是不包括對應的元素聲明,soap-enc  schema和名域為每個簡單數據類型聲明了一個元素,如<soap-enc:int  id="int1">45</soap-enc:int>  

5.2.1  字符串
字符串數據類型的定義在"xml  schema  part  2:  datatypes"規范[11]中。注意,這不同于許多數據庫和程序語言中的"string"類型,特別的,字符串數據類型可能禁止某些在那些語言中允許的字符。(這些值必須用xsd:string之外的數據類型表示)一個字符串可能編碼為一個single-reference  或  multi-reference值。包含字符串值的元素可能有一個"id"屬性。附加的accessor元素可能有對應的"href"屬性。
例如,同一字符串的兩個accessor可能以如下形式出現:  

<greeting  id="string-0">hello</greeting>
<salutation  href="#string-0"/>  

但是,如果兩個accessor參考同一字符串實例(或字符串的子類型),這不是一個實質問題,它們可以編碼為兩個single-reference值,如下所示:  

<greeting>hello</greeting>
<salutation>hello</salutation>  

這個例子的schema片斷如下所示:  

<element  name="greeting"  type="soap-enc:string"/>
<element  name="salutation"  type="soap-enc:string"/>  

在這個例子中,soap-enc:string類型用作元素的類型,這是聲明數據類型是"xsd:string"且允許"id"  和"href"屬性的元素的簡便方法。精確定義參見soap編碼schema。schemas可以使用這些源自soap編碼schema的聲明,但也可以不這樣做。  

5.2.2  enumerations
"xml  schema  part  2:  datatypes"規范  [11]  定義了"enumeration."機制。soap數據模型直接采用了這種機制。但是,由于程序語言和其它語言在定義枚舉時通常有些不同,所以我們在這里詳細闡述了它的概念并描述了一個列表成員的可能取的值是如何編碼的。"enumeration"作為一個概念表示不同的名字的集合。一個特定的枚舉就是對應于特定的基類型的不同的值的列表。例如,顏色集合("green",  "blue",  "brown")可以定義為基于字符串類型的枚舉,("1",  "3",  "5")可能是一個基于整型數的枚舉,等等。"xml  schema  part  2:  datatypes"  [11]支持除了布爾型以外所有簡單類型的枚舉。"xml  schema  part  1:  structures"規范[10]的語言可以用來定義枚舉類型。如果schema由另一個沒有特定基類型適用的符號系統生成,就使用"string"。在下面schema的例子中,"eyecolor"定義為字符串,可能的值是"green",  "blue",  或"brown"的枚舉,數據實例按照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  字符數組
一個字符數組可能編碼為single-reference  或multi-reference值。字符數組的編碼規則與字符串的編碼規則類似。特別的,包含字符數組的元素值可能由一個"id"屬性,附加的accssor元素可能有相應的"href"屬性。推薦使用定義在xml  schemas  [10][11]中的'base64'編碼(使用在2045  [13]中定義的base64編碼算法)表示模糊字符數組。不過,由于行長度(line  length)的限制,通常在mime中應用base64編碼,soap中一般不應用base64編碼。但是提供了"soap-enc:base64"子類型使之能用于soap。  

<picture  xsi:type="soap-enc:base64">
ag93ig5vdybicm73bibjb3cncg==
</picture>  

5.3  多態accessor
許多語言允許能夠多態訪問多種類型值的accessor,每種類型在運行時可用。一個多態accessor實例必須包含一個"xsi:type"屬性描述實際值的類型。例如,一個名為"cost"類型值為"xsd:float"的多態accessor編碼如下:  

<cost  xsi:type="xsd:float">29.95</cost>與之對比,類型值不變的accessor編碼如下:  

<cost>29.95</cost>  

5.4  compound  types復合類型
soap定義了與下列常在程序語言中出現的結構性模式對應的類型:  

結構:一個"struct"是一個復合值,它的成員值的唯一區別是accessor名稱,任意兩個accessor名稱都不相同。
數組:一個"array"是一個復合值,它的成員值的唯一區別是序數位置。
soap也允許結構和數組之外的其它數據的序列化,例如directed-labeled-graph  data  model之類的數據中,單個節點有許多不同的accssor,有些不止出現一次。soap序列化規則不要求底層的數據模型在accssor之間區分次序,但如果有這樣的次序的話,這些accssor必須按照這個順序編碼。  

5.4.1  復合值,結構和值引用
復合值的成員編碼為accessor元素。當accessor由名區分時(如結構),accessor名即作為元素名。名局部于類型的accessor有不受限的名,其它的accessor則有受限的名。下面的例子是類型為"book"的結構:  

<e:book>
<author>henry  ford</author>
<preface>prefatory  text</preface>
<intro>this  is  a  book.</intro>
</e:book>  

以下是描述上面結構的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>  

以下是一個同時具有簡單和復雜成員類型的例子。它顯示兩層引用。注意"author"accssor元素的"href"屬性是對相應具有"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:[email protected]</email>
<web>http://www.henryford.com<;;/web>
</e:address>  

當"person"的值和"address"的值是multi-reference時,上面的形式是正確的。如果它
們是single-reference,就必須用嵌入的形式,如下所示:  

<e:book>
<title>my  life  and  work</title>
<author>
<name>henry  ford</name>
<address>
<email>mailto:[email protected]</email>
<web>http://www.henryford.com<;;/web>
</address>
</author>
</e:book>  

如果添加一個限制,任意兩個人都不會有相同的地址,并且地址可以是街道或email地址,一本書可以有兩個作者,編碼如下:  

<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:[email protected]</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>  

序列化可以包含對不在同一個資源的值的引用:  

<e:book>
<title>paradise  lost</title>
<firstauthor  ;/>
</e:book> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉源县| 台州市| 双鸭山市| 师宗县| 南乐县| 福州市| 洪雅县| 陕西省| 吉木乃县| 柏乡县| 灌云县| 时尚| 资源县| 淮南市| 双流县| 平陆县| 阿坝| 全南县| 黔江区| 昌黎县| 孙吴县| 安阳县| 灌阳县| 栾川县| 陆河县| 贡嘎县| 龙川县| 开鲁县| 家居| 青海省| 沛县| 陆良县| 右玉县| 泸州市| 科技| 游戏| 扶风县| 济南市| 海林市| 维西| 宾阳县|