当前位置: 首页 > 知识库问答 >
问题:

SOAP消息和WSDL之间的区别?

汪思博
2023-03-14

我对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消息?

关于这一点的一些澄清将是非常棒的。

共有3个答案

隗驰
2023-03-14

在告诉SOAP和WSDL之间的区别之前,我们需要定义什么是Web服务,其中两个(SOAP和WSDL)是Web服务的组件

大多数应用程序被开发为与用户交互,用户通过界面输入或搜索数据,然后应用程序响应用户的输入。

除了Web服务应用程序只在机器之间或应用程序之间通信之外,Web服务做的事情或多或少是相同的。通常没有直接的用户交互。

Web服务基本上是用于在应用程序之间交换数据的开放协议的集合。开放协议的使用使Web服务能够独立于平台。用不同编程语言编写并在不同平台上运行的软件可以使用网络服务在计算机网络(如互联网)上交换数据。换句话说,Windows应用程序可以与PHP、Java和Perl应用程序以及许多其他应用程序对话,这在正常情况下是不可能的。

Web服务是如何工作的?

因为不同的应用程序是用不同的编程语言编写的,所以它们通常无法相互通信。Web服务通过使用开放协议和标准(主要是XML、SOAP和WSDL)的组合来实现这种通信。Web服务使用XML标记数据,使用SOAP传输消息,最后使用WSDL描述服务的可用性。让我们来看看Web服务应用程序的这三个主要组件。

简单对象访问协议(Simple Object Access Protocol,简称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文件,需要记住的主要事项是它为您提供了:

吴哲
2023-03-14

SOAP消息是用于传输数据的XML文档。WSDL是一个XML文档,它描述了如何连接和向Web服务发出请求。

基本上,SOAP消息是您传输的数据,WSDL告诉您可以做什么以及如何进行调用

在谷歌上快速搜索将产生许多额外的阅读来源(以前的图书链接现在已经失效,为了解决这个问题,任何新的推荐都会放在评论中)

请注意您的具体问题:

所有SOAP消息都是WSDL的吗?不,它们根本不是一回事。

SOAP是接受自己的“SOAP消息”还是“WSDL”的协议?无需阅读,因为这是遥远的。

如果它们不同,那么什么时候应该使用SOAP消息,什么时候应该使用WSDL消息?Soap是应用于要传输的消息/数据的结构。wsdl仅用于确定如何首先调用服务。当您第一次添加代码来调用特定的Web服务时,这通常是一次性的。

田晨
2023-03-14

每个请求发送一个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描述了当服务器接收到该消息时如何处理该消息。在我们的例子中,它描述了标题的类型,NumPages

类型如下所示;

<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消息和WSDL如何组合在一起感到困惑?我已经开始研究SOAP消息,例如: 是否所有SOAP消息都是WSDL?SOAP是接受其自己的“ SOAP消息”或“ WSDL”的协议吗?如果它们不同,那么我什么时候应该使用SOAP消息,什么时候应该使用WSDL? 关于此的一些说明将是很棒的。 问题答案: 每个请求都会发送一个SOAP文档。假设我们是一家书店,并且拥有一台远程服务器,我们

  • 问题内容: 我需要针对验证SOAP消息。(以可以根据模式验证文件的方式)。 我没有打电话给任何网络服务;我只有一条消息和一个,并且我需要验证该消息是正确的。而无需调用网络服务或之后的任何服务。 我需要在Java程序中对此进行验证。您知道一个小的Java库可以做到这一点吗? ps:我知道当您调用Web服务时,有几个库可以验证请求/响应。但是,我没有调用任何Web服务。我有一个简单的消息,还有一个,并

  • 本文向大家介绍REST API和SOAP API之间的区别,包括了REST API和SOAP API之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道,每台机器都以不同的语言或输入来理解和交易,因此Web服务是机器之间进行相互通信并在它们之间交换数据所必需的。为了对其通信实施一些限制,定义了一些规则和规定,称为网络服务,它们基本上定义了需要交换的数据的格式和类型,尤其是两台机器都应注意的

  • 本文向大家介绍管道和消息队列之间的区别,包括了管道和消息队列之间的区别的使用技巧和注意事项,需要的朋友参考一下 Unix管道 Unix Pipes用于进程间通信。顾名思义,管道可提供单向信息流。数据从一端流向另一端。 消息队列 消息队列允许发送方进程将消息共享到另一个进程。消息队列被实现为消息的链接列表,并存储在内核中。每个消息都有一个唯一的消息队列标识符。内核会记录系统中存在的消息队列。 以下是

  • 问题内容: 我是新来的消息,想知道的区别,,和 任何人都知道这些产品的不同之处吗? 提前致谢 ! 编辑: 还想知道学习这些东西的任何好地方/资源。 问题答案: ActiveMQ是一个消息代理,它实现JMS API并支持许多跨语言客户端和网络协议。它使您可以实现队列或主题,并编写侦听器或订阅者以响应队列事件。 Mule和ServiceMix是开源ESB(企业服务总线)。ESB具有JMS以外的功能:排

  • 问题内容: 我是Java新手,我知道Web服务有两种类型 SOAP Web服务。 RESTful Web服务。 谁能告诉我两者的基本区别是什么?在什么情况下创建?在什么情况下创建? 谢谢, 问题答案: 正如第一个答案已经解释的那样,SOAP Webservices和REST Webservices在各个方面有所不同。 肥皂: 您可以在.wsdl文件中定义您的界面,该文件准确描述了预期的输入参数以及