最新的Web開發教程
 

XML Soap


  • 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>