SOAP簡介
SOAP-簡易物件存取通訊協定 (SOAP)(Simple Object Access Protocol)。SOAP是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的資訊。 SOAP 可以和現存的許多網際網路協議和格式結合使用,包括超文字傳輸通訊協定 (HTTP)(HTTP),簡易郵件傳輸通訊協定(SMTP),多用途網際郵件擴充協議(MIME)。它還支援從訊息系統到遠端程序呼叫(RPC)等大量的應用程式。
SOAP為在一個鬆散的、分布的環境中使用XML對等地交換結構化的和類型化的資訊提供了一個簡單的輕量級機制。SOAP本身並不定義任何應用語義,如編程模型或特定語義實現,它只是定義了一種簡單的機制,通過一個模組化的封裝模型和對模組中特定格式編碼的資料重編碼機制來表示應用語義。SOAP的這項能力使得它可被很多類型的系統用於從訊息系統到RPC(Remote Procedure Call)的延伸。
目前W3C已經發布SOAP1.2版本標準,但是在目前廣泛應用的還是SOAP1.1版本,詳細規
SOAP V1.1:http://www.w3.org/TR/2000/NOTE-SOAP-20000508/
SOAP V1.2:http://www.w3.org/TR/2001/WD-soap12-20010709/
SOAP規範主要由四個部分組成
l SOAP信封(envelop),它定義了一個SOAP訊息表示架構,該架構描述了訊息中的內容是什麼,誰發送的,誰應當處理並處理它,以及這些操作是可選的還是必須的等。
l SOAP編碼規則(encoding rules),定義了一個資料的編碼機制,通過這樣一個編碼機制來定義應用程式中需要使用的資料類型,並可用於交換由這些應用程式定義的資料類型所衍生的執行個體。例如可能應訂單服務的需要,使用SOAP編碼規則定義了訂單的資料類型,並可以在訂單產生的用戶端與訂單服務之間交換訂單一實例。
l SOAP RPC 表示(RPC representation),定義了一個用於表示遠端程序呼叫和響應的約定,例如如何使用HTTP或SMTP協議與SOAP綁定,如何傳輸程序呼叫,在具體傳輸協議的哪個部分傳輸過程響應,如我們可以在HTTP的響應的時候傳遞過程響應。
l SOAP綁定(binding),定義了一個使用底層傳輸協議來完成在結點間交換SOAP信封的約定。
為了簡化本規範,這四部分在功能上是正交的。特別的,信封和編碼規則是被定義在不同的命名空間(namespace)中,這樣有利於通過模組化獲得簡明性。
規範中還定義了兩種SOAP綁定(binding),用於描述SOAP訊息(message)如何通過帶或不帶HTTP擴充架構[6](HTTP Extension Framework)的HTTP[5]訊息(message)進行傳輸。
SOAP 訊息基本上是從發送端到接收端的單向傳輸,但它們常常結合起來執行類似於請求/應答的模式。所有的SOAP訊息都使用XML編碼。一條SOAP訊息就是一個包含有一個必需的SOAP的封裝包,一個可選的SOAP標題和一個必需的SOAP體塊的XML文檔。
SOAP訊息組成部分如所示:
圖1.1 SOAP訊息組成部分
SOAP 請求的 XML 部分包含三個主要部分:
l Envelope 定義各個 SOAP 訊息的餘下部分會使用的 namespaces ,典型的有 xmlns:SOAP-ENV ( SOAP Envelope namespace )、 xmlns:xsi ( XML Schema for Instances ) 和 xmlns:xsd ( XML Schema for DataTypes )。
l Header 是可選的元素,它攜帶認證、交易處理和支付的輔助資訊。一個 SOAP 處理鏈中的任一元素可增加或刪除 Header 裡的項;元素也可選擇忽略它們不認識的項。如果 Header 被使用,它必須是 Envelope 的第一個子項目。
l Body 是訊息的主要有效載體。當 SOAP 被用於執行一個 RPC 調用時, Body 包含一個單獨元素,這個元素包含方法名、參數和 Web 服務的目標地址。元素的 namespace 等於目標地址,根名是方法名。
在HTTP中使用SOAPHTTP-超文字傳輸通訊協定 (HTTP)(Hypertext Transfer Protocol)用來時機傳輸WWW(World Wide Web)上的所有通訊。HTTP是一個客戶機-伺服器模型:客戶機向伺服器提交一個請求,然後伺服器由發送回一個應答。就現在而言,由於HTTP比較簡單、穩定以及被廣泛應用,而且大部分防火牆對HTTP協議的80連接埠是開放的,所以HTTP是服務運輸層的最流行的協議。
把SOAP綁定到HTTP提供了同時利用SOAP的樣式和分散的靈活性的特點以及HTTP的豐富的特徵庫的優點。在HTTP上傳送SOAP並不是說SOAP會覆蓋現有的HTTP 語義,而是HTTP上的SOAP語義會自然的映射到HTTP語義。在使用HTTP作為協議綁定的場合中, RPC請求映射到HTTP請求上,而RPC應答映射到HTTP應答。然而在 RPC 上使用SOAP並不僅限於HTTP協議綁定。
HTTP 要求和響應訊息的 Content-Type 標頭都必須設為 text/xml (在 SOAP 1.2 中是 application/soap+xml)。 對於請求訊息,它必須使用 POST 作為動詞,而 URI 應該識別 SOAP 處理器。 SOAP 規範還定義了一個名為 SOAPAction 的新 HTTP 標題,所有 SOAP HTTP 要求(即使是空的)都必須包含該標題。 SOAPAction 標題旨在表明該訊息的意圖。 對於 HTTP 響應,如果沒有發生任何錯誤,它應該使用 200 狀態代碼,如果包含 SOAP 錯誤,則應使用 500。
下面為SOAP綁定HTTP的一個樣本,在本例中,一個GetLastTradePrice SOAP請求被發送給一個StackQuote服務,該請求接受一個字串參數即蜂鳴器符號symbol,並在SOAP應答中返回一個浮點數即價格Price。SOAP Envelop元素是表示SOAP訊息的XML文檔的頂級元素。XML名稱空間用來消除應用相關標識符與SOAP標識符的歧義。
樣本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: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>
樣本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: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>
Web Service
從表面上看,Web service 就是一個應用程式,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程式。我們把調用這個Web service 的應用程式叫做客戶。
從深層次上看,Web Service是一種新的Web應用程式分支,它們是自包含、自描述、模組化的應用,可以在網路(通常為Web)中被描述、發布、尋找以及通過Web來調用。
Web Service是基於網路的、分布式的模組化組件,它執行特定的任務,遵守具體的技術規範,這些規範使得Web Service能與其他相容的組件進行互操作。它可以使用標準的互連網協議,像超文字傳輸通訊協定 (HTTP)HTTP和XML,將功能體現在互連網和企業內部網上。Web Service平台是一套標準,它定義了應用程式如何在Web上實現互通性。你可以用你喜歡的任何語言,在你喜歡的任何平台上寫Web Service。
Web service 更精確的解釋: Web services是建立可互操作的分布式應用程式的新平台。Web service平台是一套標準,它定義了應用程式如何在Web上實現互通性。你可以用任何你喜歡的語言,在任何你喜歡的平台上寫Web service ,只要我們可以通過Web service標準對這些服務進行查詢和訪問。
Web Service 三個基本技術
l Web Service通過標準通訊協定,在互連網上發布有用的程式模組(以服務的方式),目前大部分是用SOAP來作通訊協定。
l Web Service提供一份詳細的介面說明書,來協助使用者構建應用程式,這個介面說明書叫作WSDL(Web Service Description Language)。
l 通常發行的Web Service要註冊到管理伺服器,這樣便於使用者查詢和使用。這個是通過UDDI(Universal Discovery Description and Integration)來完成的。
SOAP是一種基於XML的不依賴傳輸協議的展示層協議(參見ISO 7層參考模型,TCP/IP大致相當於傳輸層和網路層,HTTP相當於會話層),用來在應用程式之間方便地以對象的形式交換資料。
在SOAP的下層,可以是HTTP/HTTPS(現在用得最多),也可以是SMTP/POP3、還可以是為一些應用而專門設計的特殊通訊協定。
SOAP應用系統可以兩種模式工作,一種被稱為RPC(Remote Procedure Call),另一種叫法不統一,在Microsoft的文檔中稱作document oriented,而在Apache的文檔中,被稱為message-oriented,這是一種可以利用XML交換更為複雜的結構資料的應用,而且,潛在地可用於B2B中長交易處理等領域。在本文中,我們將集中討論RPC,關於後者,我希望我能夠在今後的文章中為大家介紹。關於RPC的計算架構見圖1.2。
圖1.2 RPC計算架構模型
從圖1.2中,我們可以看到,SOAP RPC的工作原理非常類似於WEB的請求/應答方式,無非用的是符合SOAP規範的XML代替HTML,HTTP是個無狀態協議,但是今天通過Session來管理狀態已經是一個眾所共知的技術了,無狀態協議非常適合松偶合系統,而且對於Server Load Balancer等問題都有潛在的優勢和貢獻。
(1) 客戶程式建立了一個XML文檔,它包含了提供服務的URI、用戶端請求調用的方法名和參數資訊。如果參數時對象,則必須進行序列化操作。
(2) 目標伺服器接收到客戶程式發送的XML文檔,對齊進行解析,如果參數時對象,先對其進行還原序列化操作,然後執行用戶端請求的方法。
(3) 目標伺服器執行方法完畢後,如果方法的傳回值時對象,則進行序列化操作,然後把傳回值以XML文檔的形式返回給客戶。
(4) 客戶程式收到伺服器發來的XML文檔,如果傳回值時對象,則先進行還原序列化操作,最後擷取傳回值。
XML Parser指的是XML解析器,DOM(Document Object Model)介面指的是文件物件模型介面。