[英]Difference between a SOAP message and a WSDL?
我對SOAP消息和WSDL如何組合起來感到困惑? 我已經開始研究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消息都是WSDL的嗎? SOAP是一種接受自己的“SOAP消息”還是“WSDL”的協議? 如果它們不同,那么我何時應該使用SOAP消息?何時應該使用WSDL?
對此的一些澄清將是非常棒的。
每個請求都會發送一個SOAP文檔。 假設我們是一家書店,並且我們查詢了一台遠程服務器,以了解特定書籍的當前價格。 假設我們需要將書的標題,頁數和ISBN號傳遞給服務器。
每當我們想知道價格時,我們都會發送一條獨特的SOAP消息。 它看起來像這樣;
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetBookPrice xmlns:m="http://namespaces.my-example-book-info.com">
<ISBN>978-0451524935</ISBN>
<Title>1984</Title>
<NumPages>328</NumPages>
</m:GetBookPrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我們希望得到一條SOAP響應消息;
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetBookPriceResponse xmlns:m="http://namespaces.my-example-book-info.com">
<CurrentPrice>8.99</CurrentPrice>
<Currency>USD</Currency>
</m:GetBookPriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
然后,WSDL描述了當服務器接收到該消息時如何處理/處理該消息。 在我們的例子中,它描述了Title,NumPages和ISBN的類型,我們是否應該期望GetBookPrice消息的響應以及響應應該是什么樣的。
類型看起來像這樣;
<wsdl:types>
<!-- all type declarations are in a chunk of xsd -->
<xsd:schema targetNamespace="http://namespaces.my-example-book-info.com"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:element name="GetBookPrice">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ISBN" type="string"/>
<xsd:element name="Title" type="string"/>
<xsd:element name="NumPages" type="integer"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetBookPriceResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CurrentPrice" type="decimal" />
<xsd:element name="Currency" type="string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
但是WSDL還包含更多信息,關於哪些功能鏈接在一起以進行操作,以及哪些操作可用於服務,以及網絡上可以訪問服務/操作的位置。
另請參見W3帶注釋的WSDL示例
SOAP消息是用於傳輸數據的XML文檔。 WSDL是一個XML文檔,它描述了如何連接和向Web服務發出請求。
基本上,SOAP消息是您傳輸的數據,WSDL告訴您可以執行的操作以及如何進行調用。
在Google中進行快速搜索會產生許多額外閱讀資源(之前的圖書鏈接現已死亡,為了解決此問題,我們會在評論中提出任何新建議)
只是注意到你的具體問題:
所有SOAP消息都是WSDL的嗎? 不,他們根本不是一回事。
SOAP是一種接受自己的“SOAP消息”還是“WSDL”的協議? 不需要閱讀,因為這遠遠不夠。
如果它們不同,那么我何時應該使用SOAP消息?何時應該使用WSDL? 肥皂是您應用於傳輸的消息/數據的結構。 WSDL僅用於確定如何首先調用服務。 當您第一次添加代碼來調用特定的Web服務時,這通常是一次性的事情。
WSDL(Web服務定義語言)是描述Web服務的元數據文件。
操作名稱,參數等等
soap消息是實際的有效負載
在告訴SOAP和WSDL之間有什么區別之前我們需要定義什么是Web服務,其中兩個(SOAP和WSDL)是Web服務的組件
大多數應用程序被開發用於與用戶交互,用戶通過接口輸入或搜索數據,然后應用程序響應用戶的輸入。
Web服務或多或少地做同樣的事情,除了Web服務應用程序僅在機器之間或應用程序與應用程序之間進行通信。 通常沒有直接的用戶交互。
Web服務基本上是一組開放協議,用於在應用程序之間交換數據。 使用開放協議使Web服務能夠獨立於平台。 以不同編程語言編寫並在不同平台上運行的軟件可以使用Web服務通過諸如因特網之類的計算機網絡交換數據。 換句話說,Windows應用程序可以與PHP,Java和Perl應用程序以及許多其他應用程序通信,這在正常情況下是不可能的。
Web服務如何工作?
由於不同的應用程序是用不同的編程語言編寫的,因此它們通常無法相互通信。 Web服務通過結合使用開放協議和標准(主要是XML,SOAP和WSDL)來實現此通信。 Web服務使用XML來標記數據,使用SOAP來傳輸消息,最后使用WSDL來描述服務的可用性。 我們來看看Web服務應用程序的這三個主要組件。
簡單對象訪問協議或SOAP是用於在應用程序之間發送和接收消息而不會遇到互操作性問題的協議(互操作性意味着運行Web服務的平台變得無關緊要)。 另一種具有類似功能的協議是HTTP。 它用於訪問網頁或上網。 HTTP確保您不必擔心哪種Web服務器(無論是Apache還是IIS或其他任何服務器)為您查看的頁面提供服務,或者您查看的頁面是否是用ASP.NET或HTML創建的。
下面是SOAP請求和響應消息的示例
SOAP請求:
POST /InStock HTTP/1.1
Host: www.bookshop.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.bookshop.org/prices">
<m:GetBookPrice>
<m:BookName>The Fleamarket</m:BookName>
</m:GetBookPrice>
</soap:Body>
</soap:Envelope>
SOAP響應:
POST /InStock HTTP/1.1
Host: www.bookshop.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.bookshop.org/prices">
<m:GetBookPriceResponse>
<m: Price>10.95</m: Price>
</m:GetBookPriceResponse>
</soap:Body>
</soap:Envelope>
雖然兩條消息看起來都一樣,但它們執行的方法不同。 例如,查看上面的示例,您可以看到請求消息使用GetBookPrice
方法來獲取圖書價格。 響應由GetBookPriceResponse
方法執行,該方法將成為您作為“請求者”將看到的消息。 您還可以看到消息是使用XML組成的。
WSDL是一個描述Web服務的文檔,還告訴您如何訪問和使用它的方法。
看一下示例WSDL文件:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name ="DayOfWeek"
targetNamespace="http://www.roguewave.com/soapworx/examples/DayOfWeek.wsdl"
xmlns:tns="http://www.roguewave.com/soapworx/examples/DayOfWeek.wsdl"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="DayOfWeekInput">
<part name="date" type="xsd:date"/>
</message>
<message name="DayOfWeekResponse">
<part name="dayOfWeek" type="xsd:string"/>
</message>
<portType name="DayOfWeekPortType">
<operation name="GetDayOfWeek">
<input message="tns:DayOfWeekInput"/>
<output message="tns:DayOfWeekResponse"/>
</operation>
</portType>
<binding name="DayOfWeekBinding" type="tns:DayOfWeekPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetDayOfWeek">
<soap:operation soapAction="getdayofweek"/>
<input>
<soap:body use="encoded"
namespace="http://www.roguewave.com/soapworx/examples"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
namespace="http://www.roguewave.com/soapworx/examples"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="DayOfWeekService" >
<documentation>
Returns the day-of-week name for a given date
</documentation>
<port name="DayOfWeekPort" binding="tns:DayOfWeekBinding">
<soap:address location="http://localhost:8090/dayofweek/DayOfWeek"/>
</port>
</service>
</definitions>
關於WSDL文件要記住的主要事項是它為您提供:
比電話更好的比喻:通過郵購服務郵寄訂購產品。 WSDL文檔就像解釋如何創建服務提供者將接受的訂單表單的說明。 SOAP消息就像一個標准設計(大小,形狀,結構)的信封,世界各地的郵局都知道如何處理。 您將訂單放入這樣的信封中。 網絡(例如互聯網)是郵政服務。 你把信封放進郵件里。 郵政服務的員工不看信封。 有效負載XML是您在信封中附帶的訂單。 在郵局遞送信封后,Web服務提供商打開信封並處理訂單。 如果您已正確創建並填寫表單,他們會將您訂購的產品郵寄給您。
簡單來說,如果您有計算器的Web服務。 WSDL講述了您可以實現或向客戶端公開的函數。 例如:添加,刪除,減去等。 在使用SOAP的情況下,您實際執行doDelete(),doSubtract(),doAdd()等操作。 所以SOAP和WSDL是蘋果和橘子。 我們不應該比較它們。 它們都有自己不同的功能。
SOAP:它是一種開放的標准XML通信協議,用於將信息從用戶交換到Web服務,反之亦然。 soap只是以某種方式組織數據的文檔。 對於每個請求和響應,可能存在單獨的肥皂。
WSDL:在soap中,數據以某種方式組織,並且此組織在WSDL中指定,此處還指定了必須使用的數據類型。 對於請求和響應,將存在單個WSDL
WSDL是API提供者和客戶端之間的一種合約,它描述了Web服務:公共功能,可選/必填字段......
但肥皂消息是客戶端和提供者之間傳輸的數據(有效負載)
WSDL充當發送方和接收方之間的接口。
SOAP消息是xml格式的請求和響應。
與java RMI比較
WSDL是接口類
SOAP消息是封送的請求和響應消息。
我們可以考慮撥打電話,該號碼是wsdl,信息交換是肥皂。
WSDL描述了如何與通信服務器連接.SOAP具有通信消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.