SOAP 消息和 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?

对此进行一些澄清会很棒。

原文由 James 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 430
2 个回答

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

原文由 Jono 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

在谷歌中快速搜索会产生许多额外阅读的资源(以前的书链接现在已经失效,为了解决这个问题,将在评论中提出任何新的建议)

只需注意您的具体问题:

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

SOAP 是一种接受自己的“SOAP 消息”或“WSDL”的协议吗? 否 - 需要阅读,因为这还很遥远。

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

原文由 Matthew 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题