在分散式運算演進歷程中,SOAP (Simple Object Access Protocol) 以「不發明任何新技術」為哲學,結合 HTTP 傳輸 與 XML 編碼,解決了 CORBA、DCOM 等傳統 ORPC 技術在防火牆穿透、跨平台互通、廠商綁定等方面的痛點。本文將從 RPC 歷史脈絡切入,深入剖析 SOAP 的架構設計、編碼規則與錯誤處理機制。
分散式應用的兩大通訊模型:
雖然兩者可互相實現,但 RPC 因設計簡單、映射自然,成為主流選擇。
兩者證實可用於大規模應用,但缺乏物件導向支援。
90 年代物件導向浪潮催生 ORPC,核心差異在於:
伺服器叢集內部問題較小(機器少、同管理域、直連 IP),但客戶端到伺服器的跨網際網路通訊極具挑戰。
HTTP 缺少統一的參數編碼格式,這正是 XML 的用武之地。
<sp:reverse_string
xmlns:sp="urn:schemas-develop-com:StringProcs"
xmlns:doc="https://foo.com/documentation">
<sp:string1>Hello, World</sp:string1>
<doc:comment>This is a comment!!</doc:comment>
</sp:reverse_string>
<customer xmlns:xsd="https://www.w3.org/1999/XMLSchema">
<name xsd:type="string">Don Box</name>
<age xsd:type="float">23.5</age>
</customer>
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>
命名空間URI#方法名,功能等同 DCOM/CORBA 的介面 IDResponse 後綴,無 SOAPMethodName 標頭SOAP 不規定伺服器如何使用 Request-URI 分派請求:可映射到類別、單例物件、或透過 Cookie/查詢字串還原物件狀態。客戶端無需知曉細節,僅遵循 HTTP/XML 規則發送請求。
將方法參數打包為隱含結構:
[in]、[in,out] 參數[out]、[in,out] 參數| 型別 | 說明 |
|---|---|
| 結構元素 | Envelope、Header、Body 三大核心 |
| 根元素 | Body/Header 直屬子元素,代表呼叫/回應/錯誤物件 |
| 存取元素 | 表達欄位/屬性,單引用(內嵌值)或多引用(href 指向獨立元素) |
| 獨立元素 | 被多引用存取元素指向,帶 soap:id,置於 Header/Body 或 Package=true 元素下 |
soap:href + soap:id 保持物件參考身分xsd:null="true" 標註xsd:type 指定實際執行個體型別soap:offset、soap:position)<soap:Fault>
<faultcode>200</faultcode>
<faultstring>Unrecognized 'causality' header</faultstring>
<runcode>No</runcode>
</soap:Fault>
faultcode:標準碼或應用定義 QNamefaultstring:人類可讀描述runcode:Yes/No/Maybe,指示操作是否已執行detail:應用層例外物件SOAP 可選擇性支援 HTTP Extension Framework,將 SOAPMethodName 定義為強制標頭:
M-POST /foobar HTTP/1.1
Man: "urn:schemas-xmlsoap-org:soap.v1; ns=42"
42-SOAPMethodName: urn:bobnsid:IFoo#DoIt
未識別 SOAP 的伺服器必須回傳 501 或 510 錯誤。
SOAP 是一個「剛好使用 HTTP 作傳輸」的型別化序列化格式,緊密配合 XML Schema,實現 COM、CORBA、Java、Perl、Python、PHP 等跨平台互通。建議開發者實驗 SOAP,或使用現成的 SOAP 啟用系統(如 DevelopMentor 列表)。以腳本語言建立基本 Client/Server 往往不超過一小時,視 HTTP/XML 熟悉度與平台成熟度而定。