XML Web 服務技術解析:WSDL 與 SOAP 原理、應用案例一覽

小万哥丶發表於2024-05-31

XML Web服務是一種用於在網路上釋出、發現和使用應用程式元件的技術。它基於一系列標準和協議,如WSDL、SOAP、RDF和RSS。下面是一些相關的內容:

  • WSDL(Web服務描述語言):用於描述Web服務的基於XML的語言,定義了服務的介面、操作和訊息格式

  • SOAP(簡單物件訪問協議):是一種基於XML的協議,用於在網路上交換結構化資訊。它定義了訊息的格式和傳輸規則,並被廣泛用於Web服務之間的通訊。

  • RDF(資源描述框架):是一種描述網路資源的框架,使用XML表示。它提供了一種統一的方式來描述資源的屬性和關係,是全球資訊網上語義網的基礎之一。

  • RSS(真正簡單的資訊聚合):是一種用於釋出網站內容的XML格式。它允許使用者訂閱網站的更新,並可以自動獲取最新的內容。RSS檔案通常用於部落格、新聞網站等。

XML Web服務的特點包括:

  • 自包含和自描述:Web服務能夠描述自己的介面和功能,使其易於使用和整合到其他應用程式中。

  • 基於開放協議:Web服務使用開放的協議和標準,如HTTP和SOAP,以確保不同平臺和系統之間的互操作性。

  • 可重用的元件:Web服務提供了可重用的應用程式元件,如貨幣轉換、天氣預報等,可以被其他應用程式呼叫和整合。

  • 連線現有軟體:Web服務可以連線現有的軟體系統,並提供一種統一的方式來交換資料和呼叫功能。

在實際應用中,您可以透過建立和部署Web服務來實現各種功能和服務,從簡單的資料轉換到複雜的業務邏輯。

XML WSDL

WSDL 是 Web Services Description Language 的縮寫
WSDL 用於描述 Web 服務
WSDL 以 XML 形式編寫
WSDL 文件
WSDL 文件描述了一個 Web 服務。它指定了服務的位置以及服務的方法,使用以下主要元素:

元素 描述
定義 Web 服務 使用的 (XML Schema) 資料型別
為每個操作定義資料元素
描述可執行操作和所涉及的訊息。
為每個埠型別定義協議和資料格式

WSDL 文件的主要結構如下:

`<definitions>`

`<types>`
  資料型別定義........
`</types>`

`<message>`
  傳輸的資料定義....
`</message>`

`<portType>`
  一組操作......
`</portType>`

`<binding>`
  協議和資料格式規範....
`</binding>`

`</definitions>`

WSDL 示例

`<message name="getTermRequest">`
  `<part name="term" type="xs:string"/>`
`</message>`

`<message name="getTermResponse">`
  `<part name="value" type="xs:string"/>`
`</message>`

`<portType name="glossaryTerms">`
  `<operation name="getTerm">`
    `<input message="getTermRequest"/>`
    `<output message="getTermResponse"/>`
  `</operation>`
`</portType>`

在此示例中,<portType> 元素將 "glossaryTerms" 定義為埠的名稱,"getTerm" 定義為操作的名稱。

"getTerm" 操作具有名為 "getTermRequest" 的輸入訊息和名為 "getTermResponse" 的輸出訊息。

<message> 元素定義了每個訊息的部分和關聯的資料型別。

<portType> 元素
<portType> 元素定義了一個 Web 服務,可以執行的操作以及所涉及的訊息。

請求-響應型別是最常見的操作型別,但 WSDL 定義了四種型別:

型別 定義
One-way 該操作可以接收訊息,但不會返回響應
Request-response 該操作可以接收請求,並將返回響應
Solicit-response 該操作可以傳送請求,並將等待響應
Notification 該操作可以傳送訊息,但不會等待響應
WSDL 單向操作
單向操作示例:

`<message name="newTermValues">`
  `<part name="term" type="xs:string"/>`
  `<part name="value" type="xs:string"/>`
`</message>`

`<portType name="glossaryTerms">`
  `<operation name="setTerm">`
    `<input name="newTerm" message="newTermValues"/>`
  `</operation>`
`</portType >`

在上面的示例中,portType "glossaryTerms" 定義了一個名為 "setTerm" 的單向操作。

"setTerm" 操作允許使用 "newTermValues" 訊息輸入新術語訊息,其中包括輸入引數 "term" 和 "value"。但是,沒有為操作定義輸出。

WSDL 請求-響應操作
請求-響應操作示例:

`<message name="getTermRequest">`
  `<part name="term" type="xs:string"/>`
`</message>`

`<message name="getTermResponse">`
  `<part name="value" type="xs:string"/>`
`</message>`

`<portType name="glossaryTerms">`
  `<operation name="getTerm">`
    `<input message="getTermRequest"/>`
    `<output message="getTermResponse"/>`
  `</operation>`
`</portType>`

在上面的示例中,portType "glossaryTerms" 定義了一個請求-響應操作,名為 "getTerm"。

"getTerm" 操作需要名為 "getTermRequest" 的輸入訊息,其中包含名為 "term" 的引數,並將返回一個名為 "getTermResponse" 的輸出訊息,其中包含名為 "value" 的引數。

WSDL 繫結到 SOAP

WSDL 繫結定義了 Web 服務 的訊息格式和協議細節。

請求-響應操作示例:

`<message name="getTermRequest">`
  `<part name="term" type="xs:string"/>`
`</message>`

`<message name="getTermResponse">`
  `<part name="value" type="xs:string"/>`
`</message>`

`<portType name="glossaryTerms">`
  `<operation name="getTerm">`
    `<input message="getTermRequest"/>`
    `<output message="getTermResponse"/>`
  `</operation>`
`</portType>`

`<binding type="glossaryTerms" name="b1">`
   `<soap:binding style="document"`
   `transport="http://schemas.xmlsoap.org/soap/http" />`
   `<operation>`
     `<soap:operation soapAction="http://example.com/getTerm"/>`
     `<input><soap:body use="literal"/></input>`
     `<output><soap:body use="literal"/></output>`
  `</operation>`
`</binding>`

binding 元素具有兩個屬性 - nametype

name 屬性(您可以使用任何名稱)定義繫結的名稱,type 屬性指向繫結的埠,在本例中為 "glossaryTerms" 埠。

soap:binding 元素具有兩個屬性 - styletransport

style 屬性可以是 "rpc" 或 "document"。在這種情況下,我們使用 documenttransport 屬性定義要使用的 SOAP 協議。在這種情況下,我們使用 HTTP

operation 元素定義了 portType 公開的每個操作。

對於每個操作,必須定義相應的 SOAP 動作。您還必須指定如何編碼輸入和輸出。在本例中,我們使用 "literal"。

XML SOAP

SOAP 是 Simple Object Access Protocol 的縮寫
SOAP 是一種應用通訊協議
SOAP 是用於傳送和接收訊息的格式
SOAP 是平臺無關的
SOAP 基於 XML
為什麼使用 SOAP?
Web 應用程式 能夠在 網際網路 上進行通訊是非常重要的。

應用程式 之間進行通訊的最佳方式是透過 HTTP,因為 HTTP 受到所有 網際網路 瀏覽器和伺服器的支援。SOAP 就是為了實現這一點而建立的。

SOAP 提供了一種在執行在不同作業系統、使用不同技術和程式語言的 應用程式 之間進行通訊的方式。

SOAP 構建塊
SOAP 訊息是一個普通的 XML 文件,包含以下元素:

一個 Envelope 元素,用於標識 XML 文件作為 SOAP 訊息
一個包含頭資訊的 Header 元素
一個包含呼叫和響應資訊的 Body 元素
一個包含錯誤和狀態資訊的 Fault 元素
以上所有元素都宣告在 SOAP 信封的預設名稱空間中

語法規則
以下是一些重要的語法規則:

SOAP 訊息必須使用 XML 進行編碼
SOAP 訊息必須使用 SOAP Envelope 名稱空間
SOAP 訊息不能包含 DTD 引用
SOAP 訊息不能包含 XML 處理指令

該名稱空間將 Envelope 定義為 SOAP Envelope

如果使用了不同的名稱空間,應用程式 將生成錯誤並丟棄訊息。

encodingStyle 屬性
encodingStyle 屬性用於定義文件中使用的資料型別。該屬性可以出現在任何 SOAP 元素上,並應用於該元素及其所有子元素。

SOAP 訊息沒有預設編碼。

SOAP Header 元素
可選的 SOAP Header 元素包含關於 SOAP 訊息的應用程式特定資訊(如身份驗證、支付等)。

如果存在 Header 元素,則必須將其放在 Envelope 元素的第一個子元素位置。

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

SOAP 在預設名稱空間中定義了三個屬性。這些屬性是:mustUnderstandactorencodingStyle

SOAP Header 中定義的屬性定義了接收者應該如何處理 SOAP 訊息。

mustUnderstand 屬性
SOAP mustUnderstand 屬性可用於指示接收者是否必須處理頭部條目。

如果將 mustUnderstand="1" 新增到 Header 元素的子元素中,表示處理 Header 的接收者必須識別該元素。如果接收者不識別該元素,則在處理 Header 時將失敗。

語法
soap:mustUnderstand="0|1"

actor 屬性
SOAP 訊息可能透過沿著訊息路徑傳遞不同的端點從傳送方傳遞到

接收方。然而,SOAP 訊息的不是所有部分都可能是針對最終端點的,而是可能針對訊息路徑上的一個或多個端點。

SOAP actor 屬性用於將 Header 元素定向到特定端點。

語法
soap:actor="URI"

encodingStyle 屬性
encodingStyle 屬性用於定義文件中使用的資料型別。該屬性可以出現在任何 SOAP 元素上,它將應用於該元素的內容及其所有子元素。

SOAP 訊息沒有預設編碼。

語法
soap:encodingStyle="URI"

SOAP Body 元素
必需的 SOAP Body 元素包含了訊息的實際 SOAP 訊息,用於訊息的最終端點。

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

示例

<soap:Envelope

</m:GetPrice>
</soap:Body>

</soap:Envelope>
上面的示例請求了蘋果的價格。請注意,上面的 m:GetPriceItem 元素是應用程式特定的元素。它們不屬於 SOAP 名稱空間

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

SOAP Fault 元素包含了 SOAP 訊息的錯誤和狀態資訊。

如果存在 Fault 元素,它必須作為 Body 元素的子元素出現。Fault 元素只能在 SOAP 訊息中出現一次。

SOAP Fault 元素具有以下子元素:

子元素 描述
<faultcode> 用於標識錯誤的程式碼
<faultstring> 錯誤的人類可讀的解釋
<faultactor> 導致錯誤發生的資訊
<detail> 包含與 Body 元素相關的應用程式特定錯誤資訊

SOAP 錯誤程式碼
當描述錯誤時,faultcode 元素中必須使用以下定義的 faultcode 值:

錯誤 描述
VersionMismatchSOAP Envelope 元素的名稱空間中找到無效的名稱空間
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 繫結" 填補。SOAP 繫結是允許使用傳輸協議有效地交換 SOAP 訊息的機制。

大多數 SOAP 實現提供了常見傳輸協議的繫結,例如 HTTPSMTP

HTTP 是同步的並且被廣泛使用。SOAP HTTP 請求至少指定了兩個 HTTP 頭部:Content-TypeContent-Length

SMTP 是非同步的,通常在最後一種情況或特殊情況下使用。

JavaSOAP 實現通常為 JMSJava 訊息系統)協議提供了特定的繫結。

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

最後

為了方便其他裝置和平臺的小夥伴觀看往期文章:

微信公眾號搜尋:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關注

相關文章