本節描述了如何在使用或不使用HTTP Extension Framework的前提下將SOAP與HTTP的協同工作機制。將SOAP綁定在HTTP上可以利用HTTP豐富的特性集,提供使用SOAP形式方法和分布適應性的優點。將SOAP在HTTP上傳輸並不以為著SOAP可以完全超越HTTP的語義,更恰當的描述應當是SOAP的語義通過HTTP的映射而很自然地成為HTTP的語義。
SOAP很自然地利用HTTP的請求/響應消息模型,將SOAP請求的參數放在HTTP請求裡,而將SOAP響應的參數放在HTTP響應裡面。注意,無論如何,SOAP的中間介與HTTP中間介是不同的。也就是說,根據HTTP Connection頭字段來尋址的HTTP中間介一般並不能來處理HTTP請求中的SOAP實體體。
當需要將SOAP消息體包含在HTTP消息中時,HTTP應用程序必須依照RFC2376[3]使用媒體類型“text/xml”。
雖然SOAP可以和多種HTTP請求方法聯合使用,但這裡的綁定只定義了SOAP是如何在HTTP Post請求中傳輸的。(可參閱section 7了解如何在RPC中使用SOAP,以及section 6.3如何使用HTTP Extension Framework)
SOAPAction HTTP請求頭字段(header field)可以用於指示SOAP HTTP請求的目的。它的值是一個標識該目的的URI。SOAP對於格式上並沒有嚴格的限制,同時對URI的描述以及是否要是可解析的都沒有嚴格的限制。當發出SOAP HTTP請求時,HTTP客戶必須使用該頭字段。
soapaction = "SOAPAction" ":" [ <"> URI-reference <"> ] URI-reference = <as defined in RFC 2396 [4]>SOAPAction頭字段的存在及其內容可以被服務器例如防火牆用於在HTTP中過濾SOAP請求消息。當該字段的值為空字符串( “”)時,則意味著SOAP消息的目的由HTTP Request-URI來提供。而如果沒有值則表示對消息的目的沒有指示。
例如:
Example 42SOAPAction: "http://electrocommerce.org/abc#MyMessage" SOAPAction: "myapp.sdl" SOAPAction: "" SOAPAction:Examples of values for SOAPAction
在HTTP之上的SOAP遵從用於在HTTP中表示通訊狀態的HTTP狀態代碼的語義。例如,2xx狀態代碼表明這是客戶端包含SOAP構件的請求被成功的接收、理解和接受等等。
當處理請求的時候發生SOAP錯誤的時候,SOAP HTTP服務器必須發出一個HTTP 500 “Internal Server Error”響應同時在包含於該響應的SOAP消息中應包含一個SOAP Fault元素(參閱 section 4.4)來指明SOAP處理的錯誤。
SOAP消息可以與HTTP Extension Framework[6]一起使用來標識SOAP HTTP請求的出現和意圖。
是使用Extension Framework還是使用簡單HTTP對於通訊各方而言是一個策略及能力的問題。客戶端可以通過一個強制擴展聲明以及一個“M-”HTTP方法名前綴來強制使用HTTP Extension Framwork。服務器端可以通過使用 510 “Not Extended” HTTP狀態代碼來強制使用HTTP Extension Framework。也就是說,通過一次額外的環游,每個通訊方都可以檢測到其他通訊方和因此的動作。
用於使用Extension Framework標識SOAP的擴展標識是:
http://www.w3.org/2001/06/soap-envelope
POST /StockQuote HTTP/1.1 Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "http://electrocommerce.org/abc#MyMessage" <env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" > . . . </env:Envelope>SOAP HTTP Request Using POST
Example 44
HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" Content-Length: nnnn <env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" > . . . </env:Envelope>SOAP HTTP Response to Example 43
Example 45
M-POST /StockQuote HTTP/1.1 Man: "http://www.w3.org/2001/06/soap-envelope"; ns=NNNN Content-Type: text/xml; charset="utf-8" Content-Length: nnnn NNNN-SOAPAction: "http://electrocommerce.org/abc#MyMessage" <env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" > . . . </env:Envelope>SOAP HTTP Request using the experimental HTTP Extension Framework
Example 46
HTTP/1.1 200 OK Ext: Content-Type: text/xml; charset="utf-8" Content-Length: nnnn <env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" > . . . </env:Envelope>SOAP HTTP Response to Example 45
SOAP的一個設計目標就是要利用XML的可擴展性和可伸縮性來包裝和交換RPC調用。本節定義了一個統一的遠程過程調用和響應的表示。
其實我們也可以預想到在RPC環境下的表示很可能是與在其他表示中定義的編碼風格結合。SOAP encodingStyle屬性(參閱 section 4.3.2)可以被用於指明在本節表示中使用的方法調用/響應的編碼風格。
在RPC中使用SOAP與SOAP協議綁定(參閱 section 6)基本是正交的。在使用HTTP作為SOAP協議綁定媒介的情況下,一個RPC調用可以很自然地映射到一個HTTP請求,而RPC響應則可以映射到HTTP響應。無論如何,使用SOAP方式的RPC並不限於HTTP協議綁定。
為實施一個方法調用,需要以下信息:
目標SOAP結點的URI
方法名
可選的方法或過程的特征
方法或過程的參數
可選的頭數據
SOAP依賴協議綁定來提供傳送URI的機制。例如,對HTTP而言,請求URI指明了與該調用相對應的資源。除要求該URI是合法的以外,SOAP對於該地址沒有任何限制(參閱[4]以獲得URI的更多信息)。
RPC調用和響應都是在SOAP Body元素(參閱 section 4.3)中傳送,使用如下表示方式:
一個方法調用被建模成一個結構struct。
該方法調用顯示為一個簡單結構struct,包含每個[in]或[in/out]參數的存取標識。該結構的名和類型可使用過程或方法的名來標識。
每個[in]或[in/out]參數都被表示為一個存取標識,該存取標識的名和類型都對應於相應參數的名和類型。他們的次序也是按照原來RPC中的次序。
一個方法響應被建模成一個結構struct。
該方法響應顯示為一個簡單結構struct,包含每個[out]或[in/out]參數的存取標識。而第一個存取標識是返回值,而隨後則是按照原來次序的返回參數。
每個[out]或[in/out]參數都被表示為一個存取標識,該存取標識的名和類型都對應於相應參數的名和類型。返回值的存取標識名並沒有多少語義。同樣的,結構的名也並沒有多少語義。當然,無論如何,在添加了“Response”字串的方法名後,要有一個約定來命名它。
方法調用出錯應使用SOAP Fault元素來編碼(餐飲 section 4.4)。如果一個綁定協議對於錯誤表達還有額外規則,那麼這些規則都應當被遵守。
就象先前表述的那樣,方法和響應的結構可以使用在section 5中定義的規則來編碼,也可以使用在encodingStyle屬性中描述的其他編碼(參閱 section 4.1.1)。
應用程序可以處理漏寫參數的請求不過也可以返回一個錯誤。
因為在響應中若包含“result”則表明成功,若包含“fault”則表明失敗,所以如果方法響應中同時包含了“result”和“fau