本章節主要目的:瞭解SOAP
SOAP(Simple Object Access Protocal) 簡單對象訪問協議
以下是維基百科的解釋:
一種標準化的通訊規範,主要用於Web服務(web service)中。SOAP的出現是爲了簡化網頁服務器(Web Server)在從XML數據庫中提取數據時,無需花時間去格式化頁面,並能夠讓不同應用程序之間透過HTTP通訊協定,以XML格式互相交換彼此的數據,使其與編程語言、平臺和硬件無關。此標準由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,並得到IBM,蓮花(Lotus),康柏(Compaq)等公司的支持,於2000年提交給萬維網聯盟(World Wide Web Consortium;W3C),目前 SOAP 1.1 版是業界共同的標準,屬於第二代的XML協定(第一代具主要代表性的技術爲XML-RPC以及WDDX)。
用一個簡單的例子來說明 SOAP 使用過程,一個 SOAP 消息可以發送到一個具有 Web Service 功能的 Web 站點,例如,一個含有房價信息的數據庫,消息的參數中標明這是一個查詢消息,此站點將返回一個 XML 格式的信息,其中包含了查詢結果(價格,位置,特點,或者其他信息)。由於數據是用一種標準化的可分析的結構來傳遞的,所以可以直接被第三方站點所利用。
再總結下個人的理解:SOAP是一種由W3C維護的業界的標準,是基於XML的,具有共用性。
SOAP 消息實例
請求
POST /InStock HTTP/1.1
Host: 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:Header> <m:Trans xmlns:m="http://www.w3school.com.cn/transaction/" soap:mustUnderstand="1" soap:actor="http://www.w3school.com.cn/appml/">234</m:Trans> </soap:Header>
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
迴應
HTTP/1.1 200 OK
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:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
Envelope是SOAP的根元素,是必須的元素。
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
定義了SOAP的命名空間,並將此XML封裝爲SOAP。注意此命名空間必須爲“http://schemas.xmlsoap.org/soap/envelope/”。如若不是將會把異常拋於Fault元素。
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" 定義在文檔中使用的數據類型,可以在文檔任何部位出現。
<soap:Header> <m:Trans xmlns:m="http://www.w3school.com.cn/transaction/" soap:mustUnderstand="1">234</m:Trans> </soap:Header> Header是可選的元素,此元素可以包括應用程序的信息(比如認證、支付、版本等)。必須是文檔的第一個元素。並且所有 Header 元素的直接子元素必須是合格的命名空間
soap:actor="URI" SOAP消息路徑在發送的時候會經過不同的端點,也許打算傳送信息到一個或多個端點上,SOAP 的 actor 屬性可被用於將 Header 元素尋址到一個特定的端點
soap:mustUnderstand="1
此元素說明此信息的接受着必須對這個標題認可,如果無法認可此元素,則在處理這個頭的信息的時候失敗。
SOAP 的 Fault 元素擁有下列子元素:
子元素 描述
<faultcode> 供識別故障的代碼
<faultstring> 可供人閱讀的有關故障的說明
<faultactor> 有關是誰引發故障的信息
<detail> 存留涉及 Body 元素的應用程序專用錯誤信息
SOAP Fault 代碼
在下面定義的 faultcode 值必須用於描述錯誤時的 faultcode 元素中:
錯誤 描述
VersionMismatch SOAP Envelope 元素的無效命名空間被發現
MustUnderstand Header 元素的一個直接子元素(帶有設置爲 "1" 的 mustUnderstand 屬性)無法被理解。
Client 消息被不正確地構成,或包含了不正確的信息。
Server 服務器有問題,因此無法處理進行下去。
POST /item HTTP/1.1
Host: 189.123.345.239
Content-Type: text/plain
Content-Length: 200
服務端完成了該客戶機的請求後發送一個相應如果成功了
200 OK
Content-Type: text/plain
Content-Length: 200
失敗了
400 Bad Request
Content-Length: 0
大家可以觀察到成功返回代號200,失敗是400。
SOAP HTTP Binding
SOAP 方法指的是遵守 SOAP 編碼規則的 HTTP 請求/響應。
HTTP + XML = SOAP
SOAP 請求可能是 HTTP POST 或 HTTP GET 請求。
HTTP POST 請求規定至少兩個 HTTP 頭:Content-Type 和 Content-Length。
Content-Type
SOAP 的請求和響應的 Content-Type 頭可定義消息的 MIME 類型,以及用於請求或響應的 XML 主體的字符編碼(可選)。
語法
Content-Type: MIMEType; charset=character-encoding
例子
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length
SOAP 的請求和響應的 Content-Length 頭規定請求或響應主體的字節數。
語法
Content-Length: bytes
例子
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250