SOAP消息和WSDL之间的区别?


102

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

关于此的一些说明将是很棒的。


1
wsdl是可以发送消息以及可以预期作为响应的规范。从某种意义上说,wsdl文档对于soap通信不是必需的,但是根据协议,它是必需的元素。
troelskn

Answers:


121

每个请求都会发送一个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示例


4
当您说这一行时:“ WSDL然后描述了服务器收到消息时如何处理/处理此消息”。您不认为这里有问题吗?我认为WSDL更适合客户端知道向客户端公开哪些服务。我不认为它指导对服务器消息的处理或处理。我说得通吗
2015年

76

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

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

在Google中进行快速搜索将产生许多可供其他阅读的资源(以前的书籍链接现在已失效,要解决这个问题,任何新建议都将置入评论中)

仅注意您的特定问题:

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

SOAP是接受其自己的“ SOAP消息”或“ WSDL”的协议吗?否-需要阅读,因为距离很远。

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


如果您能阐述一些很棒的示例消息,那么我对“一次性的事情”的含义感到困惑。另外,您是说WSDL和SOAP消息一起使用吗?
詹姆斯

6
WSDL告诉您如何调用Web服务。通常,您将使用WSDL自动生成用于调用Web服务的代码,然后再也不使用它。略读我链接的书中的各章应该会有所帮助。
马修

27

WSDL(Web服务定义语言)是描述Web服务的元数据文件。

诸如操作名称,参数等内容。

肥皂消息是实际的有效载荷


25

在告诉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服务的方法


  • 具体描述
    TapanHP '18

    7

    比电话更好的比喻:通过邮购服务通过邮政邮件订购产品。WSDL文档就像是说明,该说明解释了如何创建服务提供商将接受的订单形式。SOAP消息就像具有标准设计(大小,形状,构造)的信封,世界各地的每个邮局都知道如何处理。您将订单放入这样的信封中。网络(例如互联网)是邮政服务。您将信封放入邮件中。邮政部门的员工不要看信封里面。有效负载XML是您封装在信封中的订单。邮局交付信封后,Web服务提供商将打开信封并处理订单。如果您正确创建并填写了表格,


    4

    简单来说,如果您有计算器的Web服务。WSDL讲述了可以实现或公开给客户端的功能。例如:加,删除,减等。在使用SOAP的情况下,您实际上执行诸如doDelete(),doSubtract(),doAdd()之类的操作。因此,SOAP和WSDL是苹果和橙子。我们不应该将它们进行比较。它们都有各自不同的功能。


    1

    SOAP:这是一个基于XML的开放标准通信协议,用于将信息从用户交换到Web服务,反之亦然。肥皂只是以某种方式组织数据的文档。对于每个请求和响应,都可以使用单独的肥皂。

    WSDL:在soap中,数据是以某种方式组织的,并且该组织是在WSDL中指定的。在此还指定了必须使用的数据类型。对于请求和响应,将显示单个WSDL


    0

    WSDL是API提供程序和客户端之间的一种契约,它描述了Web服务:public function,optional / required字段...

    但是肥皂消息是客户端和提供者之间传递的数据(有效负载)


    0

    WSDL充当发送者和接收者之间的接口。
    SOAP消息是xml格式的请求和响应。

    与Java RMI比较

    WSDL是接口类,
    SOAP消息是封送处理的请求和响应消息。


    -1

    我们可以认为电话号码是wsdl,信息交换是肥皂。

    WSDL描述了如何与通信服务器连接。SOAP具有通信消息。


    1
    不,电话号码更像是WSDL中定义的端点之一。在电话领域,WSDL并没有真正的等同功能。最接近的可能是电话目录,尤其是如果您包含“黄页”的概念,该概念对业务进行分类并提供有关业务的一些详细信息(而不仅仅是电话号码)。
    约翰·桑德斯
    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.