我对 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 Annotated WSDL Examples
SOAP 消息是用于传输数据的 XML 文档。 WSDL 是一个 XML 文档,它描述了如何连接 Web 服务并向其发出请求。
基本上 SOAP 消息是您传输的数据,WSDL 告诉您可以做什么以及如何进行调用。
在谷歌中快速搜索将产生许多额外阅读的资源(以前的书链接现在已经死了,为了解决这个问题,任何新的建议都会放在评论中)
只需注意您的具体问题:
所有 SOAP 消息都是 WSDL 的吗?不,它们根本不是一回事。
SOAP 是接受自己的“SOAP 消息”或“WSDL”的协议吗?不 - 需要阅读,因为这很遥远。
如果它们不同,那么什么时候应该使用 SOAP 消息,什么时候应该使用 WSDL? Soap 是您应用于消息/数据以进行传输的结构。 WSDL 仅用于首先确定如何调用服务。当您第一次添加代码以调用特定的 Web 服务时,这通常是一次性的事情。
在说明 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>
肥皂响应:
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 服务的方法
WSDL(Web 服务定义语言)是描述 Web 服务的元数据文件。
操作名称、参数等。
肥皂消息是实际的有效载荷
比电话更好的类比:通过邮购服务通过邮政邮件订购产品。 WSDL 文档就像说明如何创建服务提供商将接受的订单类型的说明。 SOAP 消息就像一个具有标准设计(大小、形状、构造)的信封,全世界的每个邮局都知道如何处理。你把你的订单放在这样一个信封里。网络(例如互联网)是邮政服务。你把信封放进邮件里。邮政服务的员工不看信封里面。有效负载 XML 是您附在信封中的订单。邮局交付信封后,Web 服务提供商打开信封并处理订单。如果您创建并正确填写了表格,他们会将您订购的产品邮寄给您。
简单来说,如果您有计算器的网络服务。 WSDL 讲述了您可以实现或向客户端公开的功能。例如:加、删、减等。在使用 SOAP 时,您实际上执行了 doDelete()、doSubtract()、doAdd() 等操作。所以 SOAP 和 WSDL 是苹果和橘子。我们不应该比较它们。它们都有自己不同的功能。
SOAP :它是一种基于 XML 的开放标准通信协议,用于将信息从用户交换到 Web 服务,反之亦然。肥皂只是以某种方式组织数据的文档。对于每个请求和响应,可能存在单独的肥皂。
WSDL:在soap中,数据以某种方式组织,这种组织在WSDL中指定,必须使用的数据类型也在此处指定。对于请求和响应,将存在单个 WSDL
WSDL 充当发送者和接收者之间的接口。 SOAP 消息是 xml 格式的请求和响应。
与java RMI比较
WSDL 是 SOAP 消息的接口类,是编组的请求和响应消息。
WSDL 是 API 提供者和客户端之间的一种契约,它描述了 Web 服务:公共功能、可选/必填字段...
但是肥皂消息是客户端和提供者之间传输的数据(有效负载)
我们可以考虑一个电话,其中号码是wsdl,信息交换是soap。
WSDL 是描述如何与通信服务器连接。SOAP 是有通信消息的。
不定期副业成功案例分享