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 元素具有兩個屬性 - 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 元素的直接子元素可以是命名空間限定的。

示例

<?xml version="1.0"?>

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19838.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓手機APP開發___廣播概述

安卓手機APP開發___廣播概述 目錄 概述 關于系統廣播 系統廣播所發生的更改 接收廣播 清單聲明的接收器 上下文注冊的接收器 對進程狀態的影響 發送廣播 通過權限限制廣播 帶權限的發送 帶權限的接收 安全注意事項和最佳做法 概述 Android 應用可以通過 Android …

數據分析案例-在線食品訂單數據可視化分析與建模分類

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

springmvc揭秘參數解析

參數解析 說到參數解析&#xff0c;springmvc中處理參數的是HandlerMethodArgumentResolver接口 public interface HandlerMethodArgumentResolver { // 判斷是否支持該類型參數 boolean supportsParameter(MethodParameter parameter); // 進行參數解析 Object resolv…

[羊城杯 2021]BabySmc

運行就是輸入flag 不知道怎么跳過去的 這個應該就是smc加密的函數了 運行完這個函數才能繼續往下 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // r12__int64 v5; // r13unsigned __int64 v6; // raxchar v7; // spcha…

學習Vue中圖片上傳前進行壓縮的實現方法

學習Vue中圖片上傳前進行壓縮的實現方法 一、前言1. 為什么要在客戶端進行圖片壓縮&#xff1f;2. Vue組件中實現圖片上傳前壓縮的方法3. 注意事項與優化4. 總結 一、前言 在Web開發中&#xff0c;圖片上傳是一個常見的功能需求&#xff0c;而客戶端對圖片進行壓縮可以有效減小…

企業如何進行快遞運費對賬?

在電子面單寄件取代手寫紙質面單之后&#xff0c;加上月結寄件模式的推行&#xff0c;企業快遞運費對賬&#xff0c;成了行政的一個難題...... 早期的手寫紙質面單寄件&#xff0c;企業行政或者財務相關人員&#xff0c;遵循寄前審批&#xff0c;寄后報銷的原則進行對賬。隨著電…

FinalShell無法連接Linux

Linux使用Vmware會創建一個網絡&#xff0c;讓兩個子網處于一個網關&#xff0c;這樣就能在windows中連接Linux&#xff0c;只有在這種情況下才能FinalShell才能連接Linux

面試題合集(2)

1. Self Attention的時候 Q K T QK^T QKT之后要除以 d ? \sqrt{d}? d ?? 參考蘇劍林大神&#xff1a; 淺談Transformer的初始化、參數化與標準化 模型初始化&#xff1a;介紹了常用的采樣分布&#xff0c;包括正態分布、均勻分布和截尾正態分布。并從代數角度理解初始化方…

module_param的用法

在Linux內核模塊編程中,`module_param`宏允許你聲明一個模塊參數。模塊參數是指可以在加載模塊時從命令行設置的參數,也可以通過/sys文件系統(如果內核配置了CONFIG_SYSFS)在模塊加載后進行修改。這些參數對于調整模塊的行為而不需要重新編譯模塊代碼非常有用。 使用方法 …

KT6368A雙模藍牙芯片上電到正常發送AT指令或指令復位需要多久

一、簡介 KT6368A芯片上電到正常發送AT指令&#xff0c;或者開啟藍牙廣播被搜索到&#xff0c;或者指令復位需要多久等等系列問題總結 詳細描述 其實這些問題歸結到一起&#xff0c;就還是一個問題&#xff0c;芯片上電需要多久的時間 在另外一份文檔里面&#xff0c;是有描…

跟我學C++中級篇——if constexpr的應用

一、場景應用 在一個開發場景下&#xff0c;需要動態處理不同類型的數據寫入。本來這個非常簡單&#xff0c;只要定義一個模板即可搞定&#xff0c;但這里偏偏有一個細節&#xff0c;是調用別人的庫來實現寫入。而這個庫對不同的數據類型的寫入&#xff0c;提供了N種不同的函數…

Python實戰開發及案例分析(28)—— 預編碼算法

預編碼算法&#xff08;Precoding Algorithm&#xff09;通常用于無線通信系統中&#xff0c;尤其是多輸入多輸出&#xff08;MIMO&#xff09;系統中&#xff0c;以提高數據傳輸的可靠性和效率。預編碼是為了在發送端對信號進行處理&#xff0c;以優化傳輸性能。 在MIMO系統中…

Java設計模式 _行為型模式_訪問者模式

一、訪問者模式 1、訪問者模式 訪問者模式&#xff08;Visitor Pattern&#xff09;是一種行為型模式。它允許在不修改已有類結構的情況下&#xff0c;向類中添加新的操作。訪問者模式通過將操作封裝在一個訪問者對象中&#xff0c;使得可以在不改變各個元素類的前提下&#x…

RedisTemplate實戰應用--隊列等

一、RedisTemplate隊列插入 1、從集合左邊插入值 https://blog.csdn.net/weixin_43658899/article/details/121040307 leftPush(K key, V value) redisTemplate.opsForList().leftPush("leftdatakey","bbbb");2、從集合左邊開始在v1值后邊插入新值v2 le…

使用 Django 連接 MySQL 數據庫

文章目錄 步驟一&#xff1a;安裝必要的庫和驅動步驟二&#xff1a;配置數據庫連接步驟三&#xff1a;執行數據庫遷移步驟四&#xff1a;開始使用 MySQL 數據庫創建一個模型遷移模型到數據庫使用模型進行數據操作創建新記錄&#xff1a;查詢記錄&#xff1a;更新記錄&#xff1…

Mac安裝第三方軟件的命令安裝方式

場景&#xff1a; 打開終端命令行&#xff0c;sudo xattr -rd com.apple.quarantine&#xff0c;注意最后quarantine 后面加一個空格&#xff01;然后打開Finder&#xff08;訪達&#xff09;&#xff0c;點擊左側的 應用程序&#xff0c;找到相關應用&#xff0c;拖進終端qua…

(超實用)京東訂單數據分析案例-維度下鉆

1&#xff0c;數據介紹&#xff0c;字段了解 盡可能熟悉業務&#xff0c;多知道字段的含義&#xff0c;字段字段間的邏輯關系&#xff0c;后期數據分析思路才能更清晰&#xff0c;結果才能更準確 2&#xff0c;訂單數據分析基本思路 維度下鉆 3&#xff0c;代碼實現全流程思路…

華為telnet的兩種認證方式

華為telnet的兩種認證方式 實驗拓撲&#xff1a; 實驗要求&#xff1a; 1.采用普通密碼認證實現telnet 遠程登錄機房設備R3 2.采用AAA認證服務方式實現telnet 遠程登錄機房設備R3 實驗步驟&#xff1a; 1.完成基本配置&#xff08;設備接口配置IP&#xff0c;此步驟略過&#…

Facebook的隱私保護挑戰:用戶數據安全的新時代

在全球范圍內&#xff0c;Facebook已經成為了不可忽視的社交媒體巨頭&#xff0c;它連接著超過20億的活躍用戶。然而&#xff0c;隨著其影響力的不斷擴大&#xff0c;關于用戶隱私和數據安全的問題也愈加引人關注。本文將深入探討Facebook面臨的隱私保護挑戰&#xff0c;以及它…

一個程序員的牢獄生涯(47)學法

星期一 學法 二鋪不知道什么時候走到了我的身邊,向我說道,這是二鋪在我進來號子后主動過來和我說話。 我聽到二鋪這聲突兀的說話后,抬起頭。這時我才看到,除了二鋪,還有六子、棍子都圍在我的身邊,看著我。雖然六子和棍子依舊一副‘吊兒郎當’的樣子,但我從他們幾個的眼神…