什麼是SOAP?

本章節主要目的:瞭解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>




我們來分析講解一下,維基百科上這個SOAP的內容

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
此元素說明此信息的接受着必須對這個標題認可,如果無法認可此元素,則在處理這個頭的信息的時候失敗。
 
  在BODY元素中的元素並不是SOAP中的元素,這些元素都是信息傳送中的數據內容所以是更具每信息的不同而不同的。

SOAP中的Fault
用來指示錯誤消息的,就幾個屬性也不展開說明了引用一下,W3C文檔的一些內容吧

SOAP 的 Fault 元素擁有下列子元素:

子元素                                  描述

<faultcode>                          供識別故障的代碼

<faultstring>                         可供人閱讀的有關故障的說明

<faultactor>                          有關是誰引發故障的信息

<detail>                                存留涉及 Body 元素的應用程序專用錯誤信息

SOAP Fault 代碼

在下面定義的 faultcode 值必須用於描述錯誤時的 faultcode 元素中:

錯誤                                    描述

VersionMismatch                SOAP Envelope 元素的無效命名空間被發現

MustUnderstand                 Header 元素的一個直接子元素(帶有設置爲 "1" 的 mustUnderstand 屬性)無法被理解。

Client                                  消息被不正確地構成,或包含了不正確的信息。

Server                                服務器有問題,因此無法處理進行下去。


SOAP協議的內容基本就是這樣。
下面講解一下最上面的HTTP協議
HTTP客戶端使用TCP去連接HTTP服務端。連接建立後客戶機可以向服務端發送請求了。
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










服務器有問題,因此無法處理進行下去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章