SOAP 消息和 WSDL 之间的区别?
Posted
技术标签:
【中文标题】SOAP 消息和 WSDL 之间的区别?【英文标题】:Difference between a SOAP message and a WSDL? 【发布时间】:2013-01-10 13:17:24 【问题描述】:我对 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?
对此进行一些澄清会很棒。
【问题讨论】:
wsdl 是对可以发送哪些消息以及可以预期什么作为响应的规范。从某种意义上说,wsdl文档对于soap通信来说并不是必需的,但是根据协议它是必需的元素。 【参考方案1】:WSDL 充当发送者和接收者之间的接口。 SOAP 消息是 xml 格式的请求和响应。
与 java RMI 比较
WSDL 是接口类 SOAP 消息是封送的请求和响应消息。
【讨论】:
【参考方案2】:WSDL 是 API 提供者和客户端之间的一种契约,它描述了 Web 服务:公共功能、可选/必填字段 ...
但soap消息是客户端和提供者之间传输的数据(有效负载)
【讨论】:
【参考方案3】:比电话更好的类比:通过邮购服务通过邮政邮件订购产品。 WSDL 文档就像说明如何创建服务提供商将接受的订单类型的说明。 SOAP 消息就像一个具有标准设计(大小、形状、构造)的信封,全世界的每个邮局都知道如何处理。你把你的订单放在这样一个信封里。网络(例如互联网)是邮政服务。你把信封放进邮件里。邮政服务的员工不看信封里面。 有效负载 XML 是您附在信封中的订单。邮局交付信封后,Web 服务提供商打开信封并处理订单。如果您创建并正确填写了表格,他们会将您订购的产品邮寄给您。
【讨论】:
【参考方案4】:在说明 SOAP 和 WSDL 之间有什么区别之前,我们需要定义什么是 Web 服务,其中两者(SOAP 和 WSDL)是 Web 服务的组件
大多数应用程序都是为了与用户交互而开发的,用户通过界面输入或搜索数据,然后应用程序响应用户的输入。
Web 服务或多或少做同样的事情,只是 Web 服务应用程序仅在机器与机器之间或应用程序与应用程序之间进行通信。通常没有直接的用户交互。
Web 服务基本上是用于在应用程序之间交换数据的开放协议的集合。开放协议的使用使 Web 服务能够独立于平台。用不同编程语言编写并在不同平台上运行的软件可以使用 Web 服务通过计算机网络(如 Internet)交换数据。换句话说,Windows 应用程序可以与 php、Java 和 Perl 应用程序以及许多其他应用程序通信,这在正常情况下是不可能的。
Web 服务如何工作?
因为不同的应用程序是用不同的编程语言编写的,所以它们经常无法相互通信。 Web 服务通过结合使用开放协议和标准(主要是 XML、SOAP 和 WSDL)来实现这种通信。 Web 服务使用 XML 标记数据,使用 SOAP 传输消息,最后使用 WSDL 来描述服务的可用性。让我们看一下 Web 服务应用程序的这三个主要组件。
简单对象访问协议 (SOAP)
简单对象访问协议或 SOAP 是一种用于在应用程序之间发送和接收消息而不会遇到互操作性问题的协议(互操作性意味着运行 Web 服务的平台变得无关紧要)。另一个具有类似功能的协议是 HTTP。它用于访问网页或上网。 HTTP 确保您不必担心哪种 Web 服务器(Apache 或 IIS 或任何其他)为您提供正在查看的页面,或者您查看的页面是用 ASP.NET 还是 html 创建的。
由于 SOAP 用于请求和响应,因此其内容会根据其用途而略有不同。
以下是 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 编写的。
Web 服务描述语言或 WSDL
WSDL 是描述 Web 服务并告诉您如何访问和使用其方法的文档。
WSDL 负责您如何知道您在 Internet 上偶然发现的 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 文件要记住的主要事项是它为您提供了:
Web 服务的描述 Web 服务使用的方法和它采用的参数 一种定位 Web 服务的方法【讨论】:
具体说明【参考方案5】:SOAP 消息是用于传输数据的 XML 文档。 WSDL 是一个 XML 文档,它描述了如何连接 Web 服务并向其发出请求。
基本上 SOAP 消息是您传输的数据,WSDL 告诉您可以做什么以及如何进行调用。
在 Google 中快速搜索会产生许多可供额外阅读的资源(以前的书籍链接现已失效,为解决此问题,将在 cmets 中添加任何新建议)
只需注意您的具体问题:
所有 SOAP 消息都是 WSDL 的吗?不,它们根本不是一回事。
SOAP 是一种接受其自己的“SOAP 消息”或“WSDL”的协议吗?不——因为这太遥远了,所以需要阅读。
如果它们不同,那么我应该什么时候使用 SOAP 消息,什么时候应该使用 WSDL? Soap 是您应用于消息/数据以进行传输的结构。 WSDL 仅用于首先确定如何调用服务。当您第一次添加代码以调用特定的 Web 服务时,这通常是一次性的事情。
【讨论】:
如果您可以详细说明一些很棒的示例消息,我会混淆您所说的“一次性”是什么意思。另外,您是说 WSDL 和 SOAP 消息一起使用? WSDL 告诉您如何调用 Web 服务。您经常会使用 WSDL 来自动生成代码来调用 Web 服务,然后再也不会使用它。浏览我链接的书中的章节应该会有所帮助。【参考方案6】:肥皂: 它是一种基于 XML 的开放标准通信协议,用于将信息从用户交换到 Web 服务,反之亦然。 肥皂只是以某种方式组织数据的文档。 对于每个请求和响应,可能存在单独的肥皂。
WSDL: 在soap中,数据以某种方式组织,这种组织在WSDL中指定,必须使用的数据类型也在此处指定。 对于请求和响应,将存在单个 WSDL
【讨论】:
【参考方案7】:简单来说,如果您有计算器的网络服务。 WSDL 讲述了您可以实现或向客户端公开的功能。例如:加、删、减等。在使用 SOAP 时,您实际上执行了诸如 doDelete()、doSubtract()、doAdd() 之类的操作。所以 SOAP 和 WSDL 是苹果和橘子。我们不应该比较它们。它们都有自己不同的功能。
【讨论】:
【参考方案8】:我们可以考虑一个电话,号码是wsdl,信息交换是soap。
WSDL 是描述如何与通信服务器连接。SOAP 是有通信消息的。
【讨论】:
不,电话号码更像是 WSDL 中定义的端点之一。在电话领域中没有真正等同于 WSDL 的东西。最接近的可能是电话簿,特别是如果您包含“黄页”的概念,该概念对企业进行分类并提供有关企业的一些详细信息(不仅仅是电话号码)。【参考方案9】:每个请求都会发送一个 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 Annotated WSDL Examples
【讨论】:
当您说这行“然后,WSDL 描述了当服务器接收到该消息时如何处理/处理该消息。”你不觉得这里有什么问题吗。我认为 WSDL 更多的是让客户了解向客户公开的服务是什么。我认为它不会指导对服务器的消息处理或处理。我说得通吗?【参考方案10】:WSDL(Web 服务定义语言)是描述 Web 服务的元数据文件。
操作名称、参数等
soap 消息是实际的有效负载
【讨论】:
以上是关于SOAP 消息和 WSDL 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
soap:address和jaxws:enpoint address之间的区别
学习 WebService 第二步:知识准备——SOAP vs REST(wsdl和wadl区别)(转)