簡單對象訪問協議(Simple Object Access Protocol,SOAP)實際上是一種 Web 服務技術,但 Web 服務中客戶機和服務器之間的數據交換格式是通過靈活的 XML 模式實現的。
Web 服務的主要優點是客戶機和服務器通過網絡進行信息和數據交換的互操作性的層次。SOAP 標准使用 XML 以一種體系結構中立的格式來構造數據,定義數據類型和信息。
對於編程語言來說,只需要提供數據類型和需要在遠程服務器上調用的函數名稱即可。SOAP 庫將用主機語言編寫的信息和格式轉化成 XML 格式的消息,其中包括調用的函數和提供的參數。
通過 W3C 的例子就可以了解 SOAP 的結構。調用遠程 SOAP 函數
GetEndorsingBoarder()
的時候,客戶機上的調用程序生成清單 1 所示的 XML 消息。
清單 1. 調用遠程 SOAP 函數 GetEndorsingBoarder()
<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:GetEndorsingBoarder xmlns:m="http://namespaces.snowboard-info.com">
<manufacturer>K2</manufacturer>
<model>Fatbob</model>
</m:GetEndorsingBoarder>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP 客戶機發送的整個消息都放在 SOAP 信封中。信封的內容就是消息的詳細內容。
被調用的函數顯然是
GetEndorsingBoarder
,它包括兩個參數:manufacturer 和 model。由此可見,它把本地的可能采用二進制編碼的字符串轉化成了 XML 字符串。由於 XML 是平台獨立的,主機使用 SOAP 系統不需要復雜的二進制編碼和解碼就可以交換消息。
服務器通過另一個 XML 編碼的 SOAP 信封返回響應,這一次是函數的返回值。SOAP 請求的響應格式與函數相同,只不過在信封內容的後面加上了
Response
,如清單 2 所示。
清單 2. SOAP 請求的響應
<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:GetEndorsingBoarderResponse xmlns:m="http://namespaces.snowboard-info.com">
<endorsingBoarder>Chris Englesmann</endorsingBoarder>
</m:GetEndorsingBoarderResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
通常不需要自己編寫 SOAP 消息,SOAP 庫會自動生成。不過 SOAP 信封的結構和簡單性表明使用 SOAP 標准共享信息很簡單。
SOAP 大大簡化了交換消息和調用遠程函數的工作。遠程過程調用(Remote Procedure Call,RPC)標准需要復雜的方法來處理二進制數據的序列化,發送結構化更高的信息需要詳細的聲明和雙向的信息轉換。
使用 SOAP,XML 序列化大大降低了這種復雜性,使得跨平台、跨語言集成和數據交換更加簡單。