SOAP v1.2為在一個松散的、分布的環境中使用XML對等地交換結構化的和類型化的信息提供了一個簡單且輕量級的機制。SOAP本身並不定義任何應用語義,如編程模型或特定語義實現,它只是定義了一種簡單的機制,通過一個模塊化的包裝模型和對模塊中特定格式編碼的數據的重編碼機制來表示應用語義。SOAP的這項能力使得它可被很多類型的系統用於從消息系統到RPC(Remote Procedure Call)的延伸。
SOAP由四部分組成:
SOAP envelop (SOAP信封,參閱 section 4),它構造定義了一個整體的表示框架,可用於表示在消息(message)中的是什麼,誰應當處理它,以及這是可選的 還是強制的。
SOAP encoding rules (SOAP編碼規則,參閱 section 5),定義了一個編序機制用於交換應用程序定義的數據類型的實例。
SOAP RPC representation (SOAP RPC表示,參閱 section 7),定義了一個用於表示遠端過程調用和響應的約定。
SOAP binding (SOAP綁定,參閱 section 6) 定義了一個使用底層傳輸協議來完成在結點間交換SOAP信封的約定。
為了簡化本規范,這四部分在功能上是正交的。特別的,信封和編碼規則是被定義在不同的命名空間(namespace)中,這樣有利於通過模塊化獲得簡明性。
本規范還定義了兩種SOAP綁定(binding),用於描述SOAP消息(message)如何通過帶或不帶HTTP擴展框架[6](HTTP Extension Framework)的HTTP[5]消息(message)進行傳輸。
SOAP的主要設計目標是簡明性和可擴展性。這就意味著有一些傳統消息系統或分布式對象系統中的特性將不包含在SOAP的核心規范中。這些特性包括:
分布式垃圾收集 (distributed garbage collection);
批量消息傳輸/處理 (boxcarring or batching of messages);
對象引用 (objects-by-reference, 需要分布式垃圾收集的支持);
對象激活 (activation, 需要對象引用的支持)。
本文中的關鍵詞“MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”的語義應當參閱RFC-2119[2]。在本中文版規范中被翻譯成:“必須”、“必須不”,“需要的”,“將”,“將不”,“應該”,“應該不”,“被推薦的”,“可以”,“可選的”。
本文中使用的命名空間前綴“env”和“enc”等關聯的SOAP命名空間分別位於以下位置:"http://www.w3.org/2001/06/soap-envelope" 和"http://www.w3.org/2001/06/soap-encoding"。
在本文的全部內容中,命名空間前綴"xs"和"xsi"總假定是與"http://www.w3.org/2001/XMLSchema" 和"http://www.w3.org/2001/XMLSchema-instance"相關聯的,這是由XML Schemas規范[10,11]所定義的。
值得注意的是其他的對命名空間前綴的使用都是比較隨意的而並沒有顯著語義的約束的。
若命名空間的URI使用"http://example.org/..."或"http://example.com/..."的形式,表明這是一些應用依賴或上下文依賴的URI[4]。
本規范使用擴充BNF(Backus-Naur Form)作為構造語言,可參閱RFC-2612 [5]。
編輯的注解將使用黃色背景標識(也許無法在所有的媒介上顯示),並使用前綴"Ednote"。
第一個例子展示了一個使用SOAP表示的簡單的通知消息。該消息包含了一個消息頭"alertcontrol"和消息體"alert",這兩部分都是由應用程序定義的,而而並不是由SOAP定義的。消息頭包含了兩個參數"priority"和"expires",用於消息傳輸中介和消息接受者對消息的處理。而消息體中則包含是實際傳送的消息。
Example 0<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope"> <env:Header> <n:alertcontrol xmlns:n="http://example.org/alertcontrol"> <n:priority>1</n:priority> <n:expires>2001-06-22T14:00:00-05:00</n:expires> </n:alertcontrol> </env:Header> <env:Body> <m:alert xmlns:m="http://example.org/alert"> <m:msg>Pick up Mary at school at 2pm</m:msg> </m:alert> </env:Body> </env:Envelope>Sample SOAP Message containing a header block and a body block
SOAP消息能夠與不同的底層協議進行綁定,同時可以在很多種消息傳輸模式中使用。下面的例子則展示了SOAP是如何在HTTP的連接中使用的,其中充分使用了HTTP提供的請求/相應機制(參閱 section 6)。
Example 1和Example 2展示了一個SOAP/HTTP請求的例子和一個SOAP/HTTP響應的例子。SOAP/HTTP請求包含了一個獲取最後交易價格(GetLastTradePrice)的信息塊,其中包含了一個簡單的參數,指明需要報價的股票代號。同樣,與先前的例子相似,GetLastTradePrice這個XML元素也並不是由SOAP自身定義的。該請求的服務響應也包含了一個簡單的參數,股票的價格。SOAP信封元素是表示SOAP消息的XML文檔的頂級元素。XML命名空間則用來消除SOAP標識符與應用定義的標識符之間可能存在的歧義。
Example 1POST /StockQuote HTTP/1.1 Host: www.stockquoteserver.com Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "http://example.org/2001/06/quotes" <env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" > <env:Body> <m:GetLastTradePrice env:encoding xmlns:m="http://example.org/2001/06/quotes"> <symbol>DIS</symbol> </m:GetLastTradePrice> </env:Body> </env:Envelope>Sample SOAP Message embedded in an HTTP Request
Example 2展示了StockQuote服務響應由Example 1描述的請求消息而返回的SOAP消息。
Example 2HTTP/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:Body> <m:GetLastTradePriceResponse env:encoding xmlns:m="http://example.org/2001/06/quotes"> <Price>34.5</Price> </m:GetLastTradePriceResponse> </env:Body> </env:Envelope>Sample SOAP Message embedded in an HTTP Response
在Appendix A中提供了更多的例子。
關於SOAP消息的格式和處理規則、為沿著SOAP消息路徑交換信息而需要的不同應用程序之間生成和接收SOAP消息的交互過程的簡單控制機制等的一整套規范和約定。
為傳輸的需要而將SOAP消息在另一個底層協議之上或之內傳輸的一整套規范和規則。典型的SOAP綁定包括在HTTP消息中傳送SOAP消息或在TCP之上傳送SOAP消息等。
SOAP結點根據SOAP定義的整套規范來處理SOAP消息。SOAP結點有責任遵守SOAP消息交換的規則以及提供通過依賴底層協議的SOAP綁定來訪問的服務。任何不符合SOAP約定的情況都將導致SOAP結點產生一個SOAP錯誤(可參閱SOAP接受者和S