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

来源:https://www.cnblogs.com/xiaowange/p/18225328
-Advertisement-
Play Games

XML Web服務是基於WSDL、SOAP、RDF和RSS等標準的網路應用程式組件技術。WSDL描述服務介面和消息格式,SOAP用於結構化信息交換,RDF描述網路資源,RSS則用於發佈網站更新。Web服務特點是自包含、自描述,基於開放協議,可重用且能連接現有軟體。WSDL文檔包含`types`、`m... ...


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,關註後即可獲取最新文章推送

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用 Vite 快速搭建腳手架 命令行選項直接指定項目名稱和想要使用的模板,Vite + Vue 項目,運行(推薦使用yarn) # npm 6.x npm init vite@latest my-vue-app --template vue # npm 7+, 需要額外的雙橫線: npm init ...
  • Vue3簡單項目流程分享——工作室主頁 零、寫在最前 以下是項目相關的一些鏈接: 源代碼GitHub倉庫(需要魔法上網):倉庫 網頁示例(需要魔法上網):網頁示例 UI圖(來源@設計師楊賀):MasterGo主頁 補充:由於時間關係,該網頁沒有適配手機端,最佳展示效果為網頁端1440p寬度。 如果你 ...
  • FormCreate 是一個可以通過 JSON 生成具有動態渲染、數據收集、驗證和提交功能的表單生成組件。支持5個UI框架,並且支持生成任何 Vue 組件。內置20種常用表單組件和自定義組件,再複雜的表單都可以輕鬆搞定 FormCreate官網:https://www.form-create.com ...
  • 初探富文本之基於虛擬滾動的大型文檔性能優化方案 虛擬滾動是一種優化長列表性能的技術,其通過按需渲染列表項來提高瀏覽器運行效率。具體來說,虛擬滾動只渲染用戶瀏覽器視口部分的文檔數據,而不是整個文檔結構,其核心實現根據可見區域高度和容器的滾動位置計算出需要渲染的列表項,同時不渲染額外的視圖內容。虛擬滾動 ...
  • title: Vue.js 動態組件與非同步組件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端開發 tags: Vue概覽 動態組件 非同步載入 性能提升 路由管理 狀態控制 工具生態 第1章 Vue.js 簡介 ...
  • 從零學習Vue.js 目錄 引言 準備工作 Vue.js 基礎 3.1 Vue 實例 3.2 模板語法 3.3 數據綁定 3.4 計算屬性和偵聽器 3.5 Class 與 Style 綁定 3.6 條件渲染 3.7 列表渲染 3.8 事件處理 3.9 表單輸入綁定 Vue.js 組件 4.1 組件基 ...
  • title: Vue插槽與作用域插槽 date: 2024/6/1 下午9:07:52 updated: 2024/6/1 下午9:07:52 categories: 前端開發 tags: VueSlot ScopeSlot 組件通信 Vue2/3插槽 作用域API 動態插槽 插槽優化 第1章:插槽 ...
  • 一、背景 在日常佈局中,無論是兩欄佈局還是三欄佈局,使用的頻率都非常高 兩欄佈局 兩欄佈局實現效果就是將頁面分割成左右寬度不等的兩列,寬度較小的列設置為固定寬度,剩餘寬度由另一列撐滿, 比如 Ant Design 文檔,藍色區域為主要內容佈局容器,側邊欄為次要內容佈局容器 這裡稱寬度較小的列父元素為 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...