- SOAP代表簡單對象訪問P rotocol
- SOAP是一種應用程序通信協議
- SOAP是用於發送和接收消息的格式
- SOAP是獨立於平台
- SOAP是基於XML的
- SOAP是一種W3C推薦
為什麼SOAP?
Web應用程序,以便能夠在互聯網上進行通信是非常重要的。
應用程序之間進行溝通的最佳方式是通過HTTP,因為HTTP被所有的互聯網瀏覽器和服務器的支持。 SOAP是為了做到這一點。
SOAP提供一種在不同的操作系統上運行,具有不同的技術和編程語言的應用程序之間進行通信。
SOAP構建模塊
SOAP消息是包含以下元素一個普通的XML文檔:
- 標識XML文檔作為SOAP消息的Envelope元素
- 包含的頭部信息Header元素
- 包含呼叫和響應信息的主體元素
- 包含錯誤的信息和狀態信息的故障元
所有元素都在SOAP信封的默認命名空間中聲明:
http://www.w3.org/2003/05/soap-envelope/
和SOAP編碼和數據類型的默認命名空間是:
http://www.w3.org/2003/05/soap-encoding
語法規則
以下是一些重要的語法規則:
- SOAP消息必須用XML來編碼
- SOAP消息必須使用SOAP信封命名空間
- SOAP消息必須使用SOAP編碼命名空間
- SOAP消息不能包含DTD引用
- SOAP消息不能包含XML處理指令
骷髏SOAP消息
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
SOAP信封元素
所需的SOAP封裝元件是SOAP消息的根元素。 此元素定義了XML文檔作為SOAP消息。
例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
該的xmlns:soap命名空間
注意到的xmlns:在上面的例子皂命名空間。 它應該總是價值: "http://www.w3.org/2003/05/soap-envelope/"
該命名空間定義信封為SOAP信封。
如果使用了不同的命名空間,應用程序生成一個錯誤並丟棄該消息。
該encodingStyle屬性
所述encodingStyle屬性用於定義文檔中使用的數據類型。 該屬性可出現在任何SOAP元素中,並適用於元素的內容和所有子元素。
SOAP消息沒有默認的編碼。
句法
soap:encodingStyle="URI"
例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
SOAP頭元素
可選的SOAP Header元素包含應用程序特定的信息(like authentication, payment, etc)有關SOAP消息。
如果標題元素是存在的,它必須是Envelope元素的第一個子元素。
Note: Header元素的所有直接子元素必須是合格的命名空間。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="http://www.w3ii.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
上面的例子中包含一個首標"Trans"元素, "mustUnderstand"為1的值的屬性,和234的值。
SOAP定義了默認的命名空間三種屬性。 這些屬性是:mustUnderstand屬性,演員,encodingStyle的。
在SOAP Header中定義的屬性定義收件人應如何處理SOAP消息。
該mustUnderstand屬性
在SOAP mustUnderstand屬性可以被用於指示一個頭項是強制的還是可選的接收方處理。
如果添加的mustUnderstand =“1”Header元素的子元素則表明接收處理頁眉必須認識到的元素。 如果接收機不能識別元件處理所述報頭時,它都將失敗。
句法
soap:mustUnderstand="0|1"
例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="http://www.w3ii.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
該actor屬性
SOAP消息可以通過不同的端點沿著消息路徑從發送到接收機。 然而,並非SOAP消息的所有部分可以被用於最終端點,相反,它可以被用於一個或更多個消息路徑上的端點。
SOAP actor屬性是用來解決Header元素到一個特定的端點。
句法
soap:actor="URI"
例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="http://www.w3ii.com/transaction/"
soap:actor="http://www.w3ii.com/appml/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
該encodingStyle屬性
所述encodingStyle屬性用於定義文檔中使用的數據類型。 這個屬性可能會出現在任何SOAP元素,它將適用於該元素的內容和所有子元素。
SOAP消息沒有默認的編碼。
句法
soap:encodingStyle="URI"
SOAP體元素
所需的SOAP Body元素包含用於該消息的最終端點的實際SOAP消息。
SOAP體元素的直接子元素可以是合格的命名空間。
例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="http://www.w3ii.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上面的例子請求蘋果的價格。 需要注意的是第m:上述GetPrice和項目元素是應用程序特定的元件。 它們不是在SOAP命名空間的一部分。
SOAP響應可能是這個樣子:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="http://www.w3ii.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP錯誤元素
可選的SOAP故障元件用於指示錯誤消息。
SOAP錯誤元素包含SOAP消息的錯誤和狀態信息。
如果故障元素是存在的,它必須是Body元素的子元素。 的故障元素只能在SOAP消息中出現一次。
SOAP錯誤元素具有以下子元素:
子元素 | 描述 |
---|---|
<faultcode> | 一種用於識別故障代碼 |
<faultstring> | 故障的可讀解釋 |
<faultactor> | 是誰造成的故障的信息 |
<detail> | 持有相關的主體元素應用特定的錯誤信息 |
SOAP故障代碼
下面定義的faultcode值必須在faultcode元素描述故障時,可以使用:
錯誤 | 描述 |
---|---|
VersionMismatch | 發現SOAP信封元素的無效命名空間 |
MustUnderstand | Header元素的一個直接子元素,用mustUnderstand屬性設置為"1"不被理解 |
Client | 不正確或形成不正確所含信息的消息 |
Server | 有與服務器的問題,所以該消息無法繼續 |
HTTP協議
HTTP在TCP / IP通信。 HTTP客戶機使用TCP連接到HTTP服務器。 建立連接之後,客戶端可以發送一個HTTP請求消息發送到服務器:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
然後,服務器處理該請求,並發送一個HTTP響應返回給客戶端。 響應包含一個狀態代碼,表示請求的狀態:
200 OK
Content-Type: text/plain
Content-Length: 200
在上面的例子中,服務器返回一個狀態代碼200。這是HTTP的標準成功代碼。
如果服務器無法對請求進行解碼,它可能會返回這樣的事情:
400 Bad Request
Content-Length: 0
SOAP綁定
SOAP規範定義了SOAP消息的結構,它們沒有如何交換。 這個間隙由所謂填充"SOAP Bindings" 。 SOAP綁定機制允許SOAP消息使用傳輸協議進行有效交換。
大多數的SOAP實現提供了常見的傳輸協議,如HTTP或SMTP的綁定。
HTTP是同步並廣泛使用。 一個SOAP HTTP請求規定至少兩個HTTP頭:Content-Type和Content-Length的。
SMTP是異步的,在萬不得已或特定的情況下使用。
SOAP的Java實現通常提供特定的JMS綁定(Java Messaging System)協議。
內容類型
一個SOAP請求和響應的Content-Type頭定義MIME類型消息和字符編碼(optional)用於請求或響應的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: bytes
例
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
一個SOAP實例
在下面的例子中,一個GetStockPrice請求被發送到服務器。 該請求具有StockName參數,這將在響應中返回一個價格參數。 該函數的命名空間中定義的"http://www.example.org/stock"
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/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/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 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/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>