監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

SOAP技術(shù)與B2B應(yīng)用集成--SOAP的消息結(jié)構(gòu)與數(shù)據(jù)的組織方法

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

SOAP技術(shù)與B2B應(yīng)用集成

--SOAP的消息結(jié)構(gòu)與數(shù)據(jù)的組織方法

 

柴曉路

Chief System Architect

2001年4月24日

本文延續(xù)前文SOAP技術(shù)和應(yīng)用概覽,結(jié)合應(yīng)用實(shí)例,對(duì)SOAP消息的結(jié)構(gòu)做了詳細(xì)而精確地闡述,通過(guò)對(duì)SOAP Envelope、SOAP Header、SOAP Body的詳細(xì)介紹使用戶對(duì)如何使用SOAP消息來(lái)描述RPC調(diào)用和響應(yīng)有了一個(gè)完整而深入地了解,并為本系列后面的介紹SOAP消息中數(shù)據(jù)的編碼規(guī)則的文章奠定了結(jié)構(gòu)基礎(chǔ)。

SOAP為在一個(gè)松散的、分布的環(huán)境中使用XML對(duì)等地交換結(jié)構(gòu)化的和類型化的信息提供了一個(gè)簡(jiǎn)單的輕量級(jí)機(jī)制。而傳送信息的基本單元承載體就是SOAP消息。從根本上來(lái)看,SOAP消息是從發(fā)送方到接受方的一種傳輸方法,但就象前面SOAP技術(shù)及應(yīng)用概覽一文中闡述的那樣,SOAP消息一般會(huì)和實(shí)現(xiàn)模式結(jié)合,例如請(qǐng)求/響應(yīng)。SOAP的實(shí)現(xiàn)可以為特殊網(wǎng)絡(luò)系統(tǒng)的特有特征來(lái)優(yōu)化。例如,通過(guò)HTTP binding將SOAP響應(yīng)消息通過(guò)HTTP響應(yīng)來(lái)傳輸,請(qǐng)求和響應(yīng)使用同一連接。

當(dāng)然,無(wú)論SOAP是與哪種協(xié)議綁定,它都使用同一種消息的描述框架格式,這種框架格式就是以SOAP Envelope(SOAP信封)為根元素,內(nèi)含SOAP Header和SOAP Body子元素的這樣一個(gè)XML文檔。SOAP消息描述文本是一種XML Application。之所以稱之為描述框架,而不稱為描述,是因?yàn)镾OAP規(guī)范為SOAP Header和SOAP Body定義了強(qiáng)大的擴(kuò)展機(jī)制,使用戶可以按需要在其中增加與應(yīng)用相關(guān)的自定義描述格式,SOAP規(guī)范只是定義了消息描述的一個(gè)骨架。

所有的SOAP消息都是使用XML格式來(lái)編碼的。SOAP應(yīng)用程序在生成由SOAP定義的所有元素和屬性的時(shí)候,應(yīng)該包含恰當(dāng)?shù)腟OAP的命名空間。SOAP應(yīng)用程序必須能處理其收到的消息中的SOAP命名空間。它必須丟棄那些包含不正確命名空間的消息,并且可以處理那些不包含SOAP命名空間的SOAP消息,就好象他們包含了正確的命名空間一樣。

SOAP定義了兩個(gè)命名空間:

SOAP信封的命名空間標(biāo)識(shí)為http://schemas.xmlsoap.org/soap/envelope/

SOAP編序的命名空間標(biāo)識(shí)為
http://schemas.xmlsoap.org/soap/encoding/

SOAP消息必須不包含DTD,同時(shí)SOAP消息也必須不包含PI(Processing Instructions)。

除SOAP mustUnderstand attribute和SOAP actor attribute外,一般允許屬性及屬性值自由地選擇是在XML實(shí)例中描述還是在XML Schema中描述,當(dāng)然前提是他們具有相同的效果。也就是說(shuō),在模式(schema)中使用默認(rèn)值或固定值定義在語(yǔ)義上等價(jià)于在實(shí)例中的值定義。

例如:在Schema中定義

<element name=&quotcompany" type=&quotstring" fixed=&quotDealEasy" >

然后在XML實(shí)例中定義

<company />

與直接在XML實(shí)例中定義

<company >DealEasy<company />

本文所引用的資源主要包括兩類,一類用于解決B2B電子商務(wù)應(yīng)用交互和集成的系列技術(shù)標(biāo)準(zhǔn)規(guī)范,他們與SOAP是一個(gè)不可分割的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等,另一類是SOAP的開(kāi)發(fā)軟件包,包括Microsoft的SOAP軟件包SOAPToolkit和Apache Project的SOAP Package。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過(guò)這些資源鏈接找到所需的內(nèi)容

SOAP的消息框架

SOAP消息是由一個(gè)強(qiáng)制的SOAP Envelope、一個(gè)可選的SOAP Header和一個(gè)強(qiáng)制的SOAP Body組成的XML文檔。作為SOAP消息的該XML文檔將在本規(guī)范的其余部分被引用。而本節(jié)的元素和屬性的命名空間標(biāo)識(shí)是http://schemas.xmlsoap.org/soap/envelope/。SOAP消息應(yīng)當(dāng)包含如下部分:

Envelope是表示該消息的XML文檔的頂級(jí)元素

Header則是為了支持在松散環(huán)境下在通訊方之間尚未預(yù)先達(dá)成一致的情況下為SOAP消息增加特性的通用機(jī)制。SOAP定義了很少的一些屬性來(lái)用于指明誰(shuí)可以處理該特性以及它是可選處理的還是強(qiáng)制處理的。

Body為該消息的最終接收者所想要得到的那些必須處理的信息提供了一個(gè)容器。此外,SOAP定義了Body的一個(gè)子元素Fault用于報(bào)告錯(cuò)誤。
這些XML元素的語(yǔ)法規(guī)則如下:

Envelope

元素名為 Envelope

該元素必須在SOAP消息中出現(xiàn),一般是根元素

該元素可以包含命名空間申明和額外的屬性。如果出現(xiàn)額外屬性(并非是SOAP規(guī)范預(yù)定義的屬性),則必須使用命名空間修飾。類似的,該元素可以包含額外的子元素,這些子元素如果出現(xiàn),必須有命名空間修飾并且必須跟在SOAP Body元素之后,也就是說(shuō)Envelope的直接子元素Header和Body必須排列在最前面。

Header

元素名為 Header

該元素可以在SOAP消息中出現(xiàn),但并不是必須出現(xiàn)(也就是說(shuō)可以僅使用Body元素完成一次SOAP消息的信息描述)。如果出現(xiàn),該元素必須是SOAP Envelope元素的第一個(gè)直接子元素。

該元素可以包含一系列的Header條目,這些條目都應(yīng)當(dāng)是Header元素的直接子元素。Header的所有直接子元素必須有命名空間修飾。

Header條目自身可以包含下級(jí)子元素,但這些元素不是Header條目,而是Header條目的內(nèi)容。

Body

元素名為 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)指示調(diào)用錯(cuò)誤的信息。

Boidy條目自身可以包含下級(jí)子元素,但這些元素不是Body條目,而是Body條目的內(nèi)容。

下面是一個(gè)SOAP消息的例子,其中Envelope包含一個(gè)Header元素和一個(gè)Body元素。Header元素有兩個(gè)Header條目,他們的命名空間修飾都是uniB2B,兩個(gè)Header條目各有一個(gè)子元素。而B(niǎo)ody元素有一個(gè)Body條目,該條目包含兩個(gè)子元素。

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header>
       <uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
           <SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
       </uniB2B:AccessAuthenticated >
       <uniB2B:GetLastProductPrice xmlns:uniB2B ="Some-URI">
            <Price>243900.00</Price>
       </uniB2B:GetLastProductPrice>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
           <ProductPrice>243900.00</ProductPrice>
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP encodingStyle屬性

SOAP的全局encodingStyle屬性被用于指明在SOAP消息中使用哪種編序規(guī)則。該屬性可以在任意元素中出現(xiàn),并且其作用范圍包括該元素的內(nèi)容和所有其子元素中未使用該屬性的所有子元素,這就象XML命名空間定義的作用范圍一樣,是向下傳遞的。對(duì)于一個(gè)SOAP消息來(lái)說(shuō),沒(méi)有默認(rèn)的編碼定義。

SOAP encodingStyle屬性的值是一個(gè)或多個(gè)用于標(biāo)識(shí)編序規(guī)則(對(duì)數(shù)據(jù)類型和數(shù)據(jù)類型實(shí)例的描述規(guī)則)和用于標(biāo)識(shí)解序SOAP消息的規(guī)則的有序列表,其排序是按照詳盡程度從大到小排列。下面是一些值的例子:

"http://schemas.xmlsoap.org/soap/encoding/"
"
http://schema.dealeasy.com/soap/encoding/ http://schema.dealeasy.com/soap/encoding/additional/"
""

而SOAP規(guī)范中定義的編序規(guī)則的標(biāo)識(shí)為http://schemas.xmlsoap.org/soap/encoding/。消息若要使用特別的編序應(yīng)該使用SOAP encodingStyle屬性來(lái)指明。另外,所有在句法上由http://schemas.xmlsoap.org/soap/encoding/開(kāi)始的URI序列表明這其中包含的所有URI都與SOAP規(guī)范中定義的SOAP編碼規(guī)則相一致。(雖然可能會(huì)添加潛在的更為嚴(yán)格的規(guī)則,也就是說(shuō)http://schemas.xmlsoap.org/soap/encoding/標(biāo)識(shí)的編碼規(guī)則是一個(gè)編碼的基類)

一個(gè)空值的URI(“”)明確地指明并未為其所包含的元素聲明任何編碼風(fēng)格。這可以為包含的元素關(guān)閉任何前面預(yù)先的聲明。

SOAP Header

SOAP提供了一個(gè)可擴(kuò)展的機(jī)制用于在分散的網(wǎng)絡(luò)環(huán)境下,模塊化地?cái)U(kuò)展SOAP消息的描述能力,而通訊雙方并不需要有完整的預(yù)先的約定。典型的擴(kuò)展例子可以是實(shí)現(xiàn)一些諸如認(rèn)證、事務(wù)管理以及支付的Header條目,當(dāng)然對(duì)于更復(fù)雜的多步驟的B2B協(xié)同,通過(guò)擴(kuò)展相對(duì)復(fù)雜的Header條目也可以實(shí)現(xiàn),在前面的文章SOAP技術(shù)及應(yīng)用概覽中就有一個(gè)完整的例子。

按照SOAP的語(yǔ)法,Header元素應(yīng)當(dāng)被編碼為SOAP Envelope XML文檔的第一直接子元素。Header的所有直接子元素都被稱為Header條目。

Header條目的編碼規(guī)則包括:

一個(gè)Header條目由一個(gè)完整修飾的元素名來(lái)標(biāo)識(shí),所謂完整修飾的元素名是由一個(gè)命名空間URI和局部名來(lái)組成。SOAP Header元素的所有直接子元素都必須是完整修飾的。不允許任何不帶命名空間修飾的Header條目存在。
SOAP encodingStyle屬性可以用于指明Header條目的編碼風(fēng)格,而encodingStyle屬性在前面已經(jīng)詳細(xì)介紹了。
SOAP mustUnderstand屬性和SOAP actor屬性可以用于指明如何處理?xiàng)l目和由誰(shuí)來(lái)處理?xiàng)l目。

在SOAP Header中,SOAP Header屬性的設(shè)置是為了讓SOAP消息的接收者了解應(yīng)該如何處理該消息。一個(gè)生成SOAP消息的SOAP應(yīng)用程序應(yīng)該僅使用SOAP Header元素的直接子元素的SOAP Header屬性。而對(duì)于那些并非作為SOAP Header元素的直接子元素出現(xiàn)的SOAP Header屬性,SOAP消息的接受者必須忽略。

以下是一個(gè)Header的例子,其中包含了一個(gè)元素標(biāo)識(shí)Priority和一個(gè)mustUnderstand屬性及其值1,以及Priority的值7,該元素表明該消息的處理優(yōu)先權(quán)為7。

<SOAP-ENV:Header>
   <uniB2B:Priority
      xmlns:uniB2B="some-URI" SOAP-ENV:mustUnderstand="1">
          7
   </uniB2B:Priority>
</SOAP-ENV:Header>

SOAP actor屬性

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消息的所有部分都是最終接收者需要了解的調(diào)用信息,其中部分是路徑中的一個(gè)或多個(gè)中間介所需要處理的。Header元素中接收者角色類似合約的接受者,他并不能將其交給其它方。也就是說(shuō),一個(gè)接收者接到其需要接收的Header元素必須不轉(zhuǎn)發(fā)該Header給SOAP消息路徑中的下一個(gè)應(yīng)用程序。該接收者可以插入一個(gè)類似的Header元素,但在這個(gè)情況下,合約關(guān)系存在于該應(yīng)用程序及下一個(gè)Header元素的接收者之間了。

SOAP actor全局屬性可以被用于指明Header元素的接收者。而SOAP actor屬性的值是一個(gè)URI。URI: http://schemas.xmlsoap.org/soap/actor/next指明該Header元素是直接的下一個(gè)進(jìn)行消息處理的SOAP應(yīng)用程序需要處理的。這與HTTP的連接頭字段的hop-by-hop scope model的表示是一致的。

若省略SOAP actor屬性,則表明該消息的接收者是SOAP消息的最終接收者。

對(duì)于一個(gè)SOAP消息的實(shí)例(在實(shí)際傳輸中的SOAP消息),這個(gè)屬性必須出現(xiàn)以指明該消息的接收方的URI。

SOAP mustUnderstand屬性

SOAP mustUnderstand全局屬性用于指明一個(gè)Header條目是強(qiáng)制必須處理的還是可選的要求接收者處理的。Header條目的接收者由SOAP actor屬性來(lái)定義。mustUnderstand屬性的值可取為“0”或“1”。若沒(méi)有使用SOAP mustUnderstand屬性,則在語(yǔ)義上等價(jià)于mustUderstand屬性出現(xiàn)同時(shí)取值為“0”。

若Header元素帶有值為“1”的SOAP mustUnderstand屬性,則該Header條目的接收者要么必須遵循語(yǔ)義(由具備完整修飾的元素名來(lái)傳達(dá))并正確地處理這些語(yǔ)義,要么必須宣稱處理消息失敗。也就是說(shuō)如果該應(yīng)用程序發(fā)現(xiàn)自己無(wú)法識(shí)別某一個(gè)Header條目(應(yīng)為在自己的處理邏輯里面沒(méi)有該條目),那么必須申明錯(cuò)誤,并響應(yīng)該錯(cuò)誤信息。

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),也就是說(shuō)不能依靠XML Schema的缺省值或固定值的設(shè)置來(lái)使該屬性生效。

SOAP Body

SOAP Body元素提供一個(gè)簡(jiǎn)單的用于與消息的最終接收者交換信息(這些信息都是必須處理的)的機(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元素的直接子元素被稱為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ī)則。

SOAP只預(yù)定義了一個(gè)Body條目:用于向調(diào)用方報(bào)告錯(cuò)誤的Body條目:Fault。

使用SOAP Body

下面是一對(duì)SOAP調(diào)用/響應(yīng)的例子,在調(diào)用消息中Body包含了一個(gè)描述調(diào)用方法的Body條目RequestPurchaseOrder,它包含兩個(gè)參數(shù)ProductID和ProductPrice。而在響應(yīng)消息中,Body中包含了一個(gè)Body條目ResponsePurchaseOrder用于描述響應(yīng)調(diào)用的返回信息,其中包含OrderID、AuthenticatedID、ProductID、ProductNumber、IssueDate。

RPC調(diào)用的SOAP消息表示

POST /ProductQuote HTTP/1.1
Host: service.eMarketplace.com.cn
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>
       <uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
           <SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
       </uniB2B:AccessAuthenticated >
       <uniB2B:GetLastProductPrice xmlns:uniB2B ="Some-URI">
            <Price>243900.00</Price>
       </uniB2B:GetLastProductPrice>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
           <ProductPrice>243900.00</ProductPrice>
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

RPC響應(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>
       <uniB2B:ResponsePurchaseOrder xmlns:uniB2B ="Some-URI">
           <OrderID>AJR786503</OrderID>
           <AuthenticatedID>76E4#12A@-98JA#V5GQ</AuthenticatedID>
           <ProductID>Jaguar_X_Type</ProductID >
           <ProductPrice>243900.00</ProductPrice>
           <ProductNumber>1</ProductNumber>
           <IssueDate>2001-4-1</IssueDate>
       </uniB2B:ResponsePurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP Header和SOAP Body的語(yǔ)義關(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)指明。

SOAP Fault

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)那些要以算法的機(jī)制來(lái)標(biāo)識(shí)錯(cuò)誤的軟件的需要。faultcode必須在SOAP Fault元素中出現(xiàn),同時(shí)faultcode的值必須是屬于后面一節(jié)中定義的一個(gè)修飾名。SOAP定義了一個(gè)很小的SOAP錯(cuò)誤代碼的集合用于覆蓋基本的SOAP錯(cuò)誤。

faultstring

faultstring元素是為那些錯(cuò)誤代碼提供人可以讀懂的錯(cuò)誤解釋,它不是為程序處理而設(shè)。Faultstring元素有點(diǎn)類似于HTTP中定義的’Reason-Phrase’。faultstring必須在SOAP Fault元素中出現(xiàn),同時(shí)它至少應(yīng)該提供一些解釋該錯(cuò)誤種類的信息。

faultactor

faultactor元素是為描述在消息路徑中是誰(shuí)引起了該錯(cuò)誤的發(fā)生的信息的。它類似于SOAP actor屬性,不過(guò)它不是用于指示Header條目的接收者,而是用于指示錯(cuò)誤源。faultactor屬性的值是一個(gè)標(biāo)識(shí)該源的一個(gè)URI。作為SOAP消息的非最終接收者的應(yīng)用程序必須在SOAP Fault元素中包含faultactor元素。而消息的最終接收者可以使用faultactor元素來(lái)明確地指明是它生成了該錯(cuò)誤。

detail

detail元素是用于傳輸與Body元素相關(guān)的應(yīng)用程序特別的錯(cuò)誤信息。如果Body元素中的內(nèi)容不能被成功地處理的時(shí)候,它必須出現(xiàn)。它必須不能被用于傳輸屬于Header條目的錯(cuò)誤信息。詳細(xì)的屬于Header條目的錯(cuò)誤信息必須在Header條目中表示傳輸。

若Fault元素中不出現(xiàn)detail元素則表明其中的錯(cuò)誤與Body元素的處理無(wú)關(guān)。這可以用于區(qū)分在在錯(cuò)誤情況下Body元素是否被處理過(guò)。

detail元素的所有直接子元素都被稱為detail條目,同時(shí)每個(gè)detail條目都作為detail元素中的一個(gè)獨(dú)立的元素進(jìn)行編碼。

Detail條目的編碼規(guī)則如下:

一個(gè)detail條目由一個(gè)完整修飾的元素名來(lái)標(biāo)識(shí),所謂完整修飾的元素名是由一個(gè)命名空間URI和局部名來(lái)組成。Detail元素的直接子元素可以是命名空間修飾的。

SOAP encodingStyle屬性可以被用來(lái)表明detail條目中使用的編碼規(guī)則。

其他的Fault子元素可以出現(xiàn),他們都應(yīng)當(dāng)提供命名空間修飾。

SOAP Fault代碼

當(dāng)描述由本規(guī)范定義的錯(cuò)誤的時(shí)候,faultcode元素必須使用在本節(jié)中定義的faultode的值。這些faultcode值的命名空間標(biāo)識(shí)為http://schemas.xmlsoap.org/soap/envelope/。

默認(rèn)的SOAP faultcode值是按照一種可擴(kuò)展的風(fēng)格來(lái)定義的,它允許在維持以有的faultcode值的向后兼容的基礎(chǔ)定義新的SOAP faultcode值。這一機(jī)制在使用上非常類似與HTTP中基本狀態(tài)類的定義1xx, 2xx, 3xx等。不過(guò),他們是用XML修飾名來(lái)定義,而不是用整數(shù)?!?”符號(hào)是faultcode值的分隔符,用于指明“.”左邊的是一個(gè)比右邊更泛化的錯(cuò)誤代碼。例如:

Client.Authentication

在本文檔中定義的faultcode值集合是:

名稱

含義

VersionMismatch

處理程序發(fā)現(xiàn)在SOAP Envelope元素中有一個(gè)非法的命名空間。

MustUnderstand

SOAP Header元素的一個(gè)直接子元素?zé)o法被理解或者他并不遵守由處理對(duì)象要求的SOAP mustUnderstand屬性必須取值為"1"的要求。

Client

Client錯(cuò)誤類用于指示以下錯(cuò)誤:消息的格式有誤或消息中缺乏能成功處理所必須的一些適當(dāng)信息。例如,消息中可能缺乏適當(dāng)?shù)恼J(rèn)證和支付信息。一般情況下應(yīng)指明消息不應(yīng)該在沒(méi)有修改過(guò)的情況下重發(fā)??蓞㈤咶ault detail子元素的描述。

Server

Server錯(cuò)誤類用于表明消息無(wú)法被處理的原因,但那些屬于內(nèi)容上的錯(cuò)誤并不屬于該范疇,它主要被用于指示那些屬于處理上的錯(cuò)誤。例如,處理操作需要包含與一個(gè)上游處理程序進(jìn)行通訊,但該程序沒(méi)有響應(yīng)。但該消息可能在下一個(gè)時(shí)間點(diǎn)上被成功處理??蓞㈤咶ault detail子元素的描述。

結(jié)語(yǔ)

本文介紹了SOAP消息的消息結(jié)構(gòu)及SOAP消息各個(gè)元素的XML語(yǔ)法和具體應(yīng)用方法,我將在下一篇文章中詳細(xì)描述在SOAP元素中如何描述具體數(shù)據(jù)(數(shù)據(jù)結(jié)構(gòu)/數(shù)據(jù)實(shí)例),并詳細(xì)介紹用于描述數(shù)據(jù)的SOAP編碼規(guī)則的語(yǔ)法。

參考資料

  • 解決B2B電子商務(wù)應(yīng)用交互和集成的InterOP Stack系列技術(shù)標(biāo)準(zhǔn)規(guī)范
    • UDDI Technical White Paper, Ariba Inc., IBM Corporation and Microsoft Corporation, 6 Sep 2000
    • Web Service Description Language (WSDL) 1.0, IBM, 25 Sep 2000
    • SOAP: Simple Object Access Protocol Specification 1.1, IBM, Microsoft, DevelopMentor, 2000
    • Extensible Markup Language (XML) 1.0 (Second Edition), W3C, 6 Oct 2000
    • XML Schema Part 0: Primer, W3C, 16 Mar 2001
  • SOAP開(kāi)發(fā)軟件包
    • Microsoft SOAP Toolkit 2.0, RC0, Microsoft Corporation
    • Apache SOAP 2.0, Apache.ORG

作者簡(jiǎn)介

柴曉路:上海得易電子商務(wù)技術(shù)有限公司首席系統(tǒng)架構(gòu)師、XML技術(shù)顧問(wèn)。2000年獲復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位,曾在國(guó)際計(jì)算機(jī)科學(xué)學(xué)術(shù)會(huì)議(ICSC)、中國(guó)XML技術(shù)研討會(huì)(北京)、計(jì)算機(jī)科學(xué)期刊等各類國(guó)際、國(guó)內(nèi)重要會(huì)議與期刊上發(fā)表論文多篇。其專長(zhǎng)為 XML與數(shù)據(jù)交換、數(shù)據(jù)庫(kù)、面向?qū)ο蠹夹g(shù)等。

發(fā)布:2007-03-25 13:25    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
石家莊OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢