學海無涯---那山那水那人
阿新 • • 發佈:2019-01-31
SOAP 簡介
SOAP 是基於 XML 的簡易協議,可使應用程式在 HTTP 之上進行資訊交換。
或者更簡單地說:SOAP 是用於訪問網路服務的協議。
您應當具備的基礎知識
在繼續學習之前,您需要對下面的知識有基本的瞭解:
- XML
- XML 名稱空間
如果您希望首先學習這些專案,請訪問我們的《XML 教程》。
什麼是 SOAP?
- SOAP 指簡易物件訪問協議
- SOAP 是一種通訊協議
- SOAP 用於應用程式之間的通訊
- SOAP 是一種用於傳送訊息的格式
- SOAP 被設計用來通過因特網進行通訊
- SOAP 獨立於平臺
- SOAP 獨立於語言
- SOAP 基於 XML
- SOAP 很簡單並可擴充套件
- SOAP 允許您繞過防火牆
- SOAP 將被作為 W3C 標準
為什麼使用 SOAP?
對於應用程式開發來說,使程式之間進行因特網通訊是很重要的。
目前的應用程式通過使用遠端過程呼叫(RPC)在諸如 DCOM 與 CORBA 等物件之間進行通訊,但是 HTTP 不是為此設計的。RPC 會產生相容性以及安全問題;防火牆和代理伺服器通常會阻止此類流量。
通過 HTTP 在應用程式間通訊是更好的方法,因為 HTTP 得到了所有的因特網瀏覽器及伺服器的支援。SOAP 就是被創造出來完成這個任務的。
SOAP 提供了一種標準的方法,使得執行在不同的作業系統並使用不同的技術和程式語言的應用程式可以互相進行通訊。
Microsoft 和 SOAP
SOAP 是微軟 .net 架構的關鍵元素,用於未來的因特網應用程式開發。
SOAP 語法
SOAP 構建模組
一條 SOAP 訊息就是一個普通的 XML 文件,包含下列元素:
- 必需的 Envelope 元素,可把此 XML 文件標識為一條 SOAP 訊息
- 可選的 Header 元素,包含頭部資訊
- 必需的 Body 元素,包含所有的呼叫和響應資訊
- 可選的 Fault 元素,提供有關在處理此訊息所發生錯誤的資訊
所有以上的元素均被聲明於針對 SOAP 封裝的預設名稱空間中:
以及針對 SOAP 編碼和資料型別的預設名稱空間:
語法規則
這裡是一些重要的語法規則:
- SOAP 訊息必須用 XML 來編碼
- SOAP 訊息必須使用 SOAP Envelope 名稱空間
- SOAP 訊息必須使用 SOAP Encoding 名稱空間
- SOAP 訊息不能包含 DTD 引用
- SOAP 訊息不能包含 XML 處理指令
SOAP 訊息的基本結構
<?xml version="1.0"?><soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
SOAP 例項
一個 SOAP 例項
在下面的例子中,一個 GetStockPrice 請求被髮送到了伺服器。此請求有一個 StockName 引數,而在響應中則會返回一個 Price 引數。此功能的名稱空間被定義在此地址中: "http://www.example.org/stock"
SOAP 請求:
POST /InStock HTTP/1.1Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
SOAP 響應:
HTTP/1.1 200 OKContent-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>