soap規(guī)范(2)
發(fā)表時(shí)間:2023-07-30 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]4.4.1 SOAP 錯(cuò)誤代碼在描述這個(gè)規(guī)范中定義的錯(cuò)誤時(shí),這一節(jié)中定義的Faultcode值必須用在faultcode元素中。這些faultcode值得名域標(biāo)志符為"http://sch...
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),概括了程序語(yǔ)言,數(shù)據(jù)庫(kù)和半結(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語(yǔ)法的schema,而僅僅表示廣義的用于表示消息結(jié)構(gòu)的定義方式),就構(gòu)造了XML語(yǔ)法的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ù)語(yǔ)用來描述編碼規(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ū)分。這叫作"accessor"。復(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)。其它情況下則無(wú)法確定。當(dāng)且僅當(dāng)一個(gè)accessor引用一個(gè)值,這個(gè)值才能被視為"single-reference",如果有不止一個(gè)accessor引用它,那么就將它視為"multi-reference"。注意,可能一個(gè)確定的值在一個(gè)schema中是"single-reference",而在另一個(gè)schema中是"multi-reference"。
在語(yǔ)句構(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í)必須用下述三種方式之一描述:(a)所屬元素實(shí)例有xsi:type屬性 (b)所屬元素是一個(gè)有SOAP-ENC:arrayType 屬性(該屬性可能是缺省的)的元素的子元素,或者(c)所屬元素的名具有特定的類型,類型可以由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è)局部的無(wú)需校驗(yàn)的屬性,屬性名為"id",類型為"ID"(依照XML Specification [7])。值的每個(gè)accessor對(duì)應(yīng)一個(gè)空元素,該元素有一個(gè)局部的,無(wú)需校驗(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è)局部的,無(wú)需校驗(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:arrayType中引用的類型必須是每個(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è)包含值為'1'的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)?quot;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ù)庫(kù)和程序語(yǔ)言中的"string"類型,特別的,字符串?dāng)?shù)據(jù)類型可能禁止某些在那些語(yǔ)言中允許的字符。(這些值必須用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ī)制。但是,由于程序語(yǔ)言和其它語(yǔ)言在定義枚舉時(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]的語(yǔ)言可以用來定義枚舉類型。如果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
許多語(yǔ)言允許能夠多態(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定義了與下列常在程序語(yǔ)言中出現(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>