SOAP技術與B2B應用集成(1)

SOAP技術與B2B應用集成(1

柴曉路

2002-4-26

本文最初由 IBM developerWorks中國網站發表,其網址是
http://www.ibm.com/developerWorks/cn/

SOAP技術及應用概覽

XML技術被引入到B2B電子商務應用中去,人們發現在B2B電子商務應用環境中,XML的確是一個非常優秀而且極爲適合的技術。XML作爲基於Internet環境多點數據交換的最佳技術完全適合在B2B電子商務環境中的多個企業/應用之間交換各類商務信息。B2B電子商務說到低就是要讓企業間的商務消息能夠廣泛地交換,能夠在一系列的企業應用中流轉,而實現完整的B2B電子信息流,以極大可能地減少人工干預,提高商務運轉的效率,獲得更多的商務機會。

爲了實現這一目的,各個B2B Solution/Software的提供商,如CommerceOneAriba等分別制訂了用於B2B應用之間交換商務消息的XML格式(XML Application),它們包括CommerceOnexCBL(XML Common Business Library)AribacXML(Commerce XML)MicrosoftBizTalk等,這些交換格式已經在衆多的B2B應用中使用。在2000年,聯合國的UN/CEFACTOASIS聯手開始制定全球電子商務的信息交換格式ebXML,完全確立了XML作爲商務應用中信息交換的標準技術的地位。使用XML來描述商務信息使得各種B2B應用在數據層上獲得了開放集成的能力。然而從技術的角度來看,這僅僅完成了應用領域中最低層次的集成:數據層集成。集成的雙方必須就數據之外的系統細節達成一致,必須瞭解對方的接受方式,網絡協議,訪問入口,安全性要求等,在模塊層,應用層仍然停留在一個不利於集成的階段。

正是爲了解決模塊層能夠以一種開放的,自說明的,統一的方式進行集成和交互,IBMMicrosoftDevelopMentor等公司協作制訂了Simple Object Access Protocol (SOAP)規範。SOAP是在XML基礎上定義的,完全繼承了XML的開放性和描述可擴展性。SOAP使用現有基於TCP/IP的應用層協議HTTPSMTPPOP3等,可以獲得與現有通信技術最大程度地兼容。SOAP的消息路徑機制和可擴充的HeaderBody機制又爲分佈式計算提供了很好的支持。

SOAP技術概覽

SOAP爲在一個鬆散的、分佈的環境中使用XML對等地交換結構化的和類型化的信息提供了一個簡單的輕量級機制。SOAP本身並不定義任何應用語義,如編程模型或特定語義實現,它只是定義了一種簡單的機制,通過一個模塊化的包裝模型和對模塊中特定格式編碼的數據重編碼機制來表示應用語義。SOAP的這項能力使得它可被很多類型的系統用於從消息系統到RPC(Remote Procedure Call)的延伸。

SOAP規範主要由三部分組成:

§         SOAP信封(envelop),它構造定義了一個整體的SOAP消息表示框架,可用於表示消息中的內容是什麼,是誰發送的,誰應當接受並處理它,以及這些處理操作是可選的還是必須的等。

§         SOAP編碼規則(encoding rules),定義了一個數據的編碼機制,通過這樣一個編碼機制來定義應用程序中需要使用的數據類型,並可用於交換由這些應用程序定義的數據類型所衍生的實例。例如可能應訂單服務的需要,使用SOAP編碼規則定義了訂單的數據類型,並可以在訂單生成的客戶端與訂單服務之間交換訂單實例。

§         SOAP RPC表示(RPC representation),定義了一個用於表示遠端過程調用和響應的約定,例如如何使用HTTPSMTP協議與SOAP綁定,如何傳輸過程調用,在具體傳輸協議的哪個部分傳輸過程響應,如我們可以在HTTP的響應的時候傳遞過程響應。

雖然這三部分是作爲SOAP的不同部分作爲一個整體定義的,但他們在功能上是正交的、彼此獨立的。特別的,信封和編碼規則是被定義在不同的XML命名空間(namespace)中,這樣有利於通過模塊化獲得定義和實現的簡明性。

由於SOAP的主要設計目標是簡明性和可擴展性。這就意味着有一些傳統消息系統或分佈式對象系統中的特性將不包含在SOAP的核心規範中。這些特性包括:分佈式垃圾收集 (Distributed garbage collection)、成批消息傳輸/處理 (Boxcarring or batching of messages)、對象引用 (Objects-by-reference)、對象激活 (Activation )

下面我首先給出一個使用SOAP調用B2B服務的一個例子,讓大家對使用SOAP來訪問B2B服務,最終獲得B2B服務的交互和集成有一個初步的和感性的認識:

在這個例子中,將向產品報價(ProductQuote)服務提交一個獲取最新交易價格(GetLastProductPrice)SOAP請求。請求將包含一個字串型的參數,指明需要報價的產品代號,而在SOAP響應中則包含一個實數的價格。SOAP信封元素是表示SOAP消息的XML文檔的根元素。XML命名空間則用來消除SOAP標識符與應用定義的標識符之間可能存在的理解歧義。這個例子使用了SOAPHTTP bindingsSOAP消息總是通過某一種網絡傳輸協議來實施傳輸,因此在以後的篇幅中,我總是將SOAP綁定在某種協議上進行闡述,比如HTTP

POST /ProductQuote HTTP/1.1
Host: b2bService.dealeasy.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>
       <DealEasyB2B:GetLastProductPrice xmlns:DealEasyB2B ="Some-URI">
           <referenceID>Jaguar_X_Type</referenceID >
       </DealEasyB2B:GetLastProductPrice>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

上面的SOAP消息是調用請求,下面的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>
       <DealEasyB2B:GetLastProductPriceResponse
         xmlns:DealEasyB2B="Some-URI">
           <Price>243900.00</Price>
       </DealEasyB2B:GetLastProductPriceResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP的消息交換模型

從根本上來看,SOAP消息是從發送方到接受方的一種傳輸方法,但就象前面例子中闡述的那樣,SOAP消息一般會和實現模式結合,例如請求/響應。SOAP的實現可以爲特殊網絡系統的特有特徵來優化。例如,通過HTTP bindingSOAP響應消息通過HTTP響應來傳輸,請求和響應使用同一連接。

然而,無論SOAP是與哪種協議綁定,消息都可以通過消息路徑(message path)來指定路線發送,消息路徑機制使消息在到達最終目的地之前可以在一個或多箇中間介上處理。這是一個非常有用、且及其適合分佈式計算環境的一個機制。例如一個申請訂單的消息可以首先到達帳戶服務(AccountAuthentication Service)確認身份獲取權限,然後到達產品價格查詢服務(ProductQuote Service)獲得所需產品的最新價格,然後進入訂單服務(PurchaseOrder Service)根據所得的最新價格產生訂單並響應調用者。通過這樣一種機制可以實現基於模塊化服務設計基礎的B2B商務流程實現,通過低耦合模塊的統一集成獲得良好的系統體系和功能實現。

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />image002.gif

 

通常,一個收到SOAP消息的SOAP應用程序必須按照以下規範、通過執行下面這些動作來處理這個SOAP消息:

1.找到並標識該SOAP消息中所有爲該應用程序設置的部分。例如,在前面的例子中,AccountAuthentication Service就需要找到並標識消息中的帳戶信息(Account Info)部分。

2.校驗該消息在前一步中獲得的被標識的部分中所有的必須處理的部分(SOAP消息規範中支持強制處理部分和可選處理部分,這一功能的實現是通過對文檔片斷加以屬性修飾而實現的),並處理這些部分。如果這部分的內容不符合雙方約定的默認定義,則丟棄該消息。處理器可以忽略在第一步中獲得的被標識的部分中的可選部分,如果這些可選部分不會影響處理的結果。例如上面的例子中,第一步完成帳戶校驗後,在消息中刪除Account Info,生成一個Session Key,加入該SOAP消息,同時向ProductQuote Service轉發該消息。

3.如果該SOAP應用程序不是該消息的最終目的地,則在該消息中刪除所有在第一步中標識的部分,如果有必要的話,附加上處理的結果部分,並轉發該消息。

爲了處理一條消息或消息的部分,SOAP處理器需要理解:使用的交換方式 (包括單向, 請求/響應,廣播等)、該方式中消息接受者的角色、RPC機制的使用方法(如果有的話)、消息中數據的編碼或表示方式以及對於正確處理所必須瞭解的另一些語義。

SOAP消息交換的例子

爲了給大家一個感性的認識,我們就結合前面舉的申請訂單的例子來看一看SOAP消息應該如何來實現,通過對這樣一種機制的理解,我們會發現我們完全可以以這樣一種方式來實現這樣一個服務網絡。AccountAuthentication Service可以位於CA認證中心,由認證中心生成Session Key,該Session Key的安全性由CA認證中心保證;ProductQuote Service位於某一個e-Marketplace,一般企業都會把自己的產品信息發佈到e-Marketplace上以尋求更多的商業機會;PurchaseOrder Service則可以位於提供該產品的企業的e-Procurement Site,這樣企業可以很方便地在標準框架下修改採購流程和訂單明細力度等。

下面就是這一個跨越多個Service的調用的SOAP消息示例:

Message I: Request a Purchase Order with AccountInfo and PruductID

POST /AccountAuthentication HTTP/1.1
Host: port.CA.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:RequestAuthentication xmlns:uniB2B=”Some-URI”>
           <AccountName>DealEasy</AccountName>
           <AccountPassword>12345</AccountPassword>
       </uniB2B:RequestAuthentication>
       <uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
            targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
           <ProductID>Jaguar_X_Type</ProductID >
           <FinalUsage function="RequestPurchaseOrder" />
       </uniB2B:RequestProductInfo>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Message II: Request a Purchase Order with SessionKey and PruductID

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:RequestProductInfo xmlns:uniB2B=”Some-URI”
            targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
           <ProductID>Jaguar_X_Type</ProductID >
           <FinalUsage function="RequestPurchaseOrder" />
       </uniB2B:RequestProductInfo>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Message III: Request a Purchase Order with SessionKey, PruductID and PruductPrice

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>

Message IV: Response a Purchase Order with PruductID and PruductPrice

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技術是如何使B2B應用在一個通用開放和廣泛的環境下協同工作及相互集成。在大家對SOAP技術有一個初步的瞭解之後,我將在以後的文章中,依次詳細介紹SOAP信封的結構及應用,SOAP編碼方式與其他XML模式的關係及應用以及SOAPRPC規範及應用。

 

參考資料

1.      技術規範

UDDI, SOAP, WSDL, XML Schema

2.      開發軟件包

MSSOAPKIT,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章