首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SOAP 協議入門指南:從 RPC 歷史到 XML 編碼規則

     編輯:Java 相關知識

前言:為什麼需要 SOAP?

在分散式運算發展早期,程式設計師鮮少關注網路協定。隨著網際網路普及,構建可擴展的分散式應用成為主流需求。SOAP(Simple Object Access Protocol)應運而生,它結合了成熟的 HTTP 傳輸與 XML 的靈活擴展性,旨在解決異構平台間的互通性問題,讓現有應用能被更廣泛的用戶存取。

RPC 與 ORPC 的演進歷程

從傳統 RPC 到物件導向 RPC

早期的 Sun RPC 與 DCE RPC 奠定了遠端程序呼叫的基礎。隨著物件導向技術興起,業界嘗試將物件概念引入網路通訊,誕生了 ORPC(Object RPC)。ORPC 的關鍵在於將通訊端點映射到語言層級的物件,例如 CORBA 的 IOR 與 DCOM 的 OBJREF,兩者雖格式相似,但在參數編碼(NDR vs CDR)與介面識別方式上存在差異,導致互通性受限。

現有技術的困境

  • 廠商鎖定: DCOM 依賴 Windows,CORBA 需統一 ORB 產品,跨廠商互通困難。
  • 環境依賴: 兩者皆需嚴格管理的部署環境,防火牆與代理伺服器常阻擋其通訊封包。
  • 複雜度高: 開發者需深入理解 ORB 或 OLE32.DLL 細節,入門門檻極高。
  • 網際網路不友善: 難以穿透防火牆,且依賴特定埠號,不像 HTTP 那麼普遍被允許。

HTTP:更適合 RPC 的傳輸協定

HTTP 具備請求/回應模型、基於文字的標頭、廣泛的防火牆支援,且由 IIS、Apache 等成熟伺服器處理。一個典型的 HTTP POST 請求包含方法、URI、標頭(Content-Type、Content-Length)與主體內容。伺服器回應狀態碼(如 200 OK)與資料主體。HTTP 的無狀態、文字基礎特性,使其成為輕量級 RPC 傳輸的理想選擇。

XML:中性且可擴展的資料表達

XML 解決了 HTTP 缺乏統一參數編碼格式的問題。相比 NDR/CDR,XML 擁有:

  • 跨平台的解析器生態系
  • 基於文字,易於除錯與低技術門檻處理
  • 命名空間機制消除元素歧義
  • XML Schema 提供型別定義與驗證

範例:<reverse_string xmlns="urn:schemas-develop-com:StringProcs"><string1>Hello, World</string1></reverse_string>

SOAP = HTTP + XML

SOAP 訊息結構

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>

SOAP 回應格式

回應同樣包裝在 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 編碼核心規則

請求/回應物件序列化

SOAP 將方法參數打包為請求與回應結構體。例如 withdraw(account, amount) 對應請求結構 {long account; float amount;},回應結構 {float newBalance; float amount; bool overdrawn;}。序列化遵循元素正規格式(ENF),每個欄位對應一個子元素。

SOAP Envelope、Header、Body

  • Envelope:根元素,命名空間 urn:schemas-xmlsoap-org:soap.v1
  • Header:可選,承載協定擴展資訊(如交易內容、安全性),可標記 mustUnderstand="true" 強制處理
  • Body:必須,包含單一根元素(呼叫、回應或錯誤)

資料型別與多重參考

支援簡單型別、複合型別、陣列、空值(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)。

HTTP 擴展框架與結語

SOAP 可選擇性支援 HTTP Extension Framework,以標準化方式處理強制標頭。總結來說,SOAP 是一個型別化的序列化格式,恰巧採用 HTTP 作為傳輸,緊密配合 XML Schema,實現了 COM、CORBA、Java、Perl、Python 等異構環境的互通。開發者可快速建立 SOAP 服務與客戶端,享受開放標準帶來的互通紅利。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved