1. 程式人生 > >SOAP簡單物件訪問協議詳細介紹

SOAP簡單物件訪問協議詳細介紹

一、單物件訪問協議是交換資料的一種協議規範,是一種輕量的、簡單的、基於XML標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的資訊。

更為簡單的說:SOAP是基於XML的簡易協議,是用於訪問網路服務的協議

在學習瞭解SOAP協議之前,需要對XML和XML名稱空間有所瞭解


什麼是SOAP?

1、指的是簡易物件訪問協議

2、是一種通訊協議

3、是用於應用程式之間的通訊

4、是一種用於傳送訊息的格式

5、倍設計用來通過因特網進行通訊

6、獨立於平臺、獨立於語言、是基於XML的

7、簡單並且可以擴充套件、允許繞過防火牆、被作為W3CSchool來發展

為什麼使用SOAP協議呢?

對於應用程式開發來說,使程式之間進行因特網通訊是非常重要的

目前的應用程式通過使用遠端過程呼叫RPC在諸如DCOM和CORBA等物件之間進行通訊,但是HTTP並不是為此設計的,RPC會產生相容性以及安全性問題:防火牆和代理伺服器通常會阻止此類流量

通過HTTp在應用程式之間通訊是最好的方法,因為HTTP得到了所有因特網瀏覽器以及伺服器的支援,SOAP就是被創造出來,完成這個任務的

SOAP提供了一種標準的方法,使在執行在不用的作業系統並使用不同技術和程式語言的應用程式可以進行互相的通訊


SOAP的構建模組

一條SOAP訊息就是一個普通的XML文件,包含以下因素

1、必須的Envelope元素,可以把此XML文件標識為一條SOAP訊息

2、可選的header元素,包含有頭部資訊

3、必須的body元素,包含所有的呼叫和相應資訊

4、可選的fault元素,提供有關處理此訊息發生的錯誤資訊

語法規則:

1、必須使用xml來進行編碼

2、必須使用soap envelope明明空間

3、必須使用soap Encoding明明空間

4、SOAP訊息不能包含DTD引用

5、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 Envelope 元素

強制使用的 SOAP 的 Envelope 元素是 SOAP 訊息的根元素。

必需的 SOAP 的 Envelope 元素是 SOAP 訊息的根元素。它可把 XML 文件定義為 SOAP 訊息。

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">
  ...
  Message information goes here
  ...
</soap:Envelope>

xmlns:soap 名稱空間

SOAP 訊息必須擁有與名稱空間 "http://www.w3.org/2001/12/soap-envelope" 相關聯的一個 Envelope 元素。

如果使用了不同的名稱空間,應用程式會發生錯誤,並拋棄此訊息。


encodingStyle 屬性

SOAP 的 encodingStyle 屬性用於定義在文件中使用的資料型別。此屬性可出現在任何 SOAP 元素中,並會被應用到元素的內容及元素的所有子元素上。

SOAP 訊息沒有預設的編碼方式。

語法

soap:encodingStyle="URI"

例項

<?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">
  ...
  Message information goes here
  ...
</soap:Envelope>

SOAP Header 元素


可選的 SOAP Header 元素包含頭部資訊。


SOAP Header 元素

可選的 SOAP Header 元素可包含有關 SOAP 訊息的應用程式專用資訊(比如認證、支付等)。

如果 Header 元素被提供,則它必須是 Envelope 元素的第一個子元素。

注意: 所有 Header 元素的直接子元素必須是合格的名稱空間。

<?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.w3schools.com/transaction/"
 soap:mustUnderstand="1">234
 </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

上面的例子包含了一個帶有一個 "Trans" 元素的頭部,它的值是 234,此元素的 "mustUnderstand" 屬性的值是 "1"。

SOAP 在預設的名稱空間中 ("http://www.w3.org/2001/12/soap-envelope") 定義了三個屬性。

這三個屬性是:actor、 mustUnderstand 以及 encodingStyle。這些被定義在 SOAP 頭部的屬性可定義容器如何對 SOAP 訊息進行處理。


mustUnderstand 屬性

SOAP 的 mustUnderstand 屬性可用於標識標題項對於要對其進行處理的接收者來說是強制的還是可選的。

假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則它可指示處理此頭部的接收者必須認可此元素。假如此接收者無法認可此元素,則在處理此頭部時必須失效。

語法

soap:mustUnderstand="0|1"

例項

<?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.w3schools.com/transaction/"
 soap:mustUnderstand="1">234
 </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

actor 屬性

通過沿著訊息路徑經過不同的端點,SOAP 訊息可從某個傳送者傳播到某個接收者。並非 SOAP 訊息的所有部分均打算傳送到 SOAP 訊息的最終端點,不過,另一個方面,也許打算傳送給訊息路徑上的一個或多個端點。

SOAP 的 actor 屬性可被用於將 Header 元素定址到一個特定的端點。

語法

soap:actor=" URI"

例項

<?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.w3schools.com/transaction/"
 soap:actor="http://www.w3schools.com/appml/">234
 </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

encodingStyle 屬性

SOAP 的 encodingStyle 屬性用於定義在文件中使用的資料型別。此屬性可出現在任何 SOAP 元素中,並會被應用到元素的內容及元素的所有子元素上。

SOAP 訊息沒有預設的編碼方式。

語法

soap:encodingStyle=" URI"

SOAP Body 元素


強制使用的 SOAP Body 元素包含實際的 SOAP 訊息。


SOAP Body 元素

必需的 SOAP Body 元素可包含打算傳送到訊息最終端點的實際 SOAP 訊息。

SOAP Body 元素的直接子元素可以是合格的名稱空間。

例項

<?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>
  <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
    <m:Item>Apples</m:Item>
  </m:GetPrice>
</soap:Body>

</soap:Envelope>

上面的例子請求蘋果的價格。請注意,上面的 m:GetPrice 和 Item 元素是應用程式專用的元素。它們並不是 SOAP 標準的一部分。

而一個 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:Body>
  <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices">
    <m:Price>1.90</m:Price>
  </m:GetPriceResponse>
</soap:Body>

</soap:Envelope>

SOAP Fault 元素


SOAP Fault 元素用於存留 SOAP 訊息的錯誤和狀態資訊。


SOAP Fault 元素

可選的 SOAP Fault 元素用於指示錯誤訊息。

如果已提供了 Fault 元素,則它必須是 Body 元素的子元素。在一條 SOAP 訊息中,Fault 元素只能出現一次。

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

子元素 描述
<faultcode> 供識別故障的程式碼
<faultstring> 可供人閱讀的有關故障的說明
<faultactor> 有關是誰引發故障的資訊
<detail> 存留涉及 Body 元素的應用程式專用錯誤資訊

SOAP Fault 程式碼

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

錯誤 描述
VersionMismatch SOAP Envelope 元素的無效名稱空間被發現
MustUnderstand Header 元素的一個直接子元素(帶有設定為 "1" 的 mustUnderstand 屬性)無法被理解。
Client 訊息被不正確地構成,或包含了不正確的資訊。
Server 伺服器有問題,因此無法處理進行下去。

SOAP HTTP 協議


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

SOAP 例項


一個 SOAP 例項

在下面的例子中,一個 GetStockPrice 請求被髮送到了伺服器。此請求有一個 StockName 引數,而在響應中則會返回一個 Price 引數。此功能的名稱空間被定義在此地址中: "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/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 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>

WSDL

WSDL 是基於 XML 的語言,用於描述 Web services 以及如何訪問它們。

WSDL 可描述某個 web service,連同用於此 web service 的訊息格式和協議細節。

如果您需要學習更多有關 WSDL 的知識,請訪問我們的 WSDL 教程

Web Services

Web services 可把應用程式轉換為網路應用程式(web-applications)。

通過使用 XML,訊息可在應用程式之間進行傳送。

如果您需要學習更多有關 web services 的知識,請訪問我們的 Web Services 教程