XML Web 服務技術解析:WSDL 與 SOAP 原理、應用案例一覽
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 元素具有兩個屬性 - name 和 type。
name 屬性(您可以使用任何名稱)定義綁定的名稱,type 屬性指向綁定的端口,在本例中為 "glossaryTerms" 端口。
soap:binding 元素具有兩個屬性 - style 和 transport。
style 屬性可以是 "rpc" 或 "document"。在這種情況下,我們使用 document。transport 屬性定義要使用的 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 在默認命名空間中定義了三個屬性。這些屬性是:mustUnderstand、actor 和 encodingStyle。
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:GetPrice 和 Item 元素是應用程序特定的元素。它們不屬于 SOAP 命名空間
SOAP Fault 元素
可選的 SOAP Fault 元素用于指示錯誤消息。
SOAP Fault 元素包含了 SOAP 消息的錯誤和狀態信息。
如果存在 Fault 元素,它必須作為 Body 元素的子元素出現。Fault 元素只能在 SOAP 消息中出現一次。
SOAP Fault 元素具有以下子元素:
子元素 描述
<faultcode> 用于標識錯誤的代碼
<faultstring> 錯誤的人類可讀的解釋
<faultactor> 導致錯誤發生的信息
<detail> 包含與 Body 元素相關的應用程序特定錯誤信息
SOAP 錯誤代碼
當描述錯誤時,faultcode 元素中必須使用以下定義的 faultcode 值:
錯誤 描述
VersionMismatch 在 SOAP 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 實現提供了常見傳輸協議的綁定,例如 HTTP 或 SMTP。
HTTP 是同步的并且被廣泛使用。SOAP HTTP 請求至少指定了兩個 HTTP 頭部:Content-Type 和 Content-Length。
SMTP 是異步的,通常在最后一種情況或特殊情況下使用。
Java 的 SOAP 實現通常為 JMS(Java 消息系統)協議提供了特定的綁定。
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,關注后即可獲取最新文章推送
看完如果覺得有幫助,歡迎點贊、收藏、關注

XML Web服務是基于WSDL、SOAP、RDF和RSS等標準的網絡應用程序組件技術。WSDL描述服務接口和消息格式,SOAP用于結構化信息交換,RDF描述網絡資源,RSS則用于發布網站更新。Web服務特點是自包含、自描述,基于開放協議,可重用且能連接現有軟件。WSDL文檔包含`types`、`message`、`portType`和`binding`元素,定義服務操作和協議。SOAP協議規定消息格式,通過HTTP等傳輸。
浙公網安備 33010602011771號