在分散式運算發展早期,程式設計師鮮少關注網路協定。隨著網際網路普及,構建可擴展的分散式應用成為主流需求。SOAP(Simple Object Access Protocol)應運而生,它結合了成熟的 HTTP 傳輸與 XML 的靈活擴展性,旨在解決異構平台間的互通性問題,讓現有應用能被更廣泛的用戶存取。
早期的 Sun RPC 與 DCE RPC 奠定了遠端程序呼叫的基礎。隨著物件導向技術興起,業界嘗試將物件概念引入網路通訊,誕生了 ORPC(Object RPC)。ORPC 的關鍵在於將通訊端點映射到語言層級的物件,例如 CORBA 的 IOR 與 DCOM 的 OBJREF,兩者雖格式相似,但在參數編碼(NDR vs CDR)與介面識別方式上存在差異,導致互通性受限。
HTTP 具備請求/回應模型、基於文字的標頭、廣泛的防火牆支援,且由 IIS、Apache 等成熟伺服器處理。一個典型的 HTTP POST 請求包含方法、URI、標頭(Content-Type、Content-Length)與主體內容。伺服器回應狀態碼(如 200 OK)與資料主體。HTTP 的無狀態、文字基礎特性,使其成為輕量級 RPC 傳輸的理想選擇。
XML 解決了 HTTP 缺乏統一參數編碼格式的問題。相比 NDR/CDR,XML 擁有:
範例:<reverse_string xmlns="urn:schemas-develop-com:StringProcs"><string1>Hello, World</string1></reverse_string>
SOAP 將 XML 編碼規則套用於 HTTP 傳輸內容。一個 SOAP 請求必須是 HTTP POST,Content-Type 為 text/xml,並包含 SOAPMethodName 標頭指定呼叫的方法(格式:命名空間URI#方法名)。
POST /string_server/Object17 HTTP/1.1
Host: 209.110.197.2
Content-Type: text/xml
Content-Length: 152
SOAPMethodName: urn:strings-com:IString#reverse
<Envelope>
<Body>
<m:reverse xmlns:m='urn:strings-com:IString'>
<theString>Hello, World</theString>
</m:reverse>
</Body>
</Envelope>
回應同樣包裝在 Envelope/Body 中,方法名加上 Response 後綴,承載 [out] 與 [in,out] 參數。
200 OK
Content-Type: text/xml
Content-Length: 162
<Envelope>
<Body>
<m:reverseResponse xmlns:m='urn:strings-com:IString'>
<result>dlroW ,olleH</result>
</m:reverseResponse>
</Body>
</Envelope>
SOAP 將方法參數打包為請求與回應結構體。例如 withdraw(account, amount) 對應請求結構 {long account; float amount;},回應結構 {float newBalance; float amount; bool overdrawn;}。序列化遵循元素正規格式(ENF),每個欄位對應一個子元素。
urn:schemas-xmlsoap-org:soap.v1mustUnderstand="true" 強制處理支援簡單型別、複合型別、陣列、空值(xsd:null)、型別替換(xsd:type)與物件身分保留(soap:id / soap:href)。多重參考存取器透過片段識別符引用獨立元素,確保物件圖在反序列化時保持引用關係。
陣列包含秩與容量,支援部分傳輸(soap:offset)與稀疏陣列(soap:position)。編碼範例:
<points xsd:type='t:POINT[3]'>
<POINT><x>3</x><y>4</y></POINT>
<POINT><x>7</x><y>5</y></POINT>
<POINT><x>1</x><y>9</y></POINT>
</points>
SOAP 定義標準 Fault 元素,包含 faultcode、faultstring、runcode(Yes/No/Maybe)與可選的 detail 承載應用層例外。HTTP 層錯誤直接回傳標準狀態碼(4xx/5xx)。
SOAP 可選擇性支援 HTTP Extension Framework,以標準化方式處理強制標頭。總結來說,SOAP 是一個型別化的序列化格式,恰巧採用 HTTP 作為傳輸,緊密配合 XML Schema,實現了 COM、CORBA、Java、Perl、Python 等異構環境的互通。開發者可快速建立 SOAP 服務與客戶端,享受開放標準帶來的互通紅利。