第 3 章 定义服务使用的逻辑消息


摘要

服务由调用其操作时交换的消息定义。在 WSDL 合同中,这些消息使用 message 元素来定义。消息由一个或多个使用 part 元素定义的部分组成。

概述

服务的操作是通过指定调用操作时交换的逻辑消息来定义的。这些逻辑消息定义通过网络作为 XML 文档传递的数据。它们包含作为方法调用的一部分的所有参数。 逻辑消息使用合同中的 message 元素定义。每个逻辑消息由一个或多个部分组成,这些部分在部分元素 中定义

虽然您的消息可以将每个参数列为单独的部分,但建议的做法是使用单一部分来封装操作所需的数据。

消息和参数列表

服务公开的每个操作只能有一个输入消息和一个输出消息。输入消息定义服务在调用操作时收到的所有信息。输出消息定义服务在操作完成后返回的所有数据。故障消息定义服务在发生错误时返回的数据。

此外,每个操作可以具有任意数量的故障信息。故障消息定义服务遇到错误时返回的数据。这些消息通常只有一个部分,它为消费者提供足够信息以了解错误。

用于与旧系统集成的消息设计

如果您要将现有应用程序定义为服务,您必须确保实现该操作的方法所使用的每个参数都在消息中表示。您还必须确保返回值包含在操作的输出消息中。

定义您的消息的一种方法是 RPC 样式。使用 RPC 样式时,您可以在方法参数列表中为每个参数定义一个部分消息。每个消息部分都基于合同的 type 元素中定义的 类型。您的输入消息包含方法中的每个输入参数的一个部分。您的输出消息包含每个输出参数的一个部分,以及表示返回值的部分(如果需要)。如果参数同时是输入和输出参数,它将被列为输入消息和输出消息的一部分。

当启用使用传输的传统系统(如 Tibco 或 CORBA )时,RPC 样式消息定义非常有用。这些系统围绕程序和方法设计。因此,它们最容易使用类似于被调用操作的参数列表的消息建模。RPC 样式还在服务及其公开的应用程序之间进行更干净的映射。

SOAP 服务的消息设计

RPC 样式可用于对现有系统建模,但服务的社区强烈优先选择嵌套式文档样式。在嵌套文档样式中,每条消息都有一个部分。消息的部分引用合同的 type 元素中定义的 wrapper 元素。wrapper 元素具有以下特征:

  • 它是包含一系列元素的复杂类型。如需更多信息,请参阅 第 2.5 节 “定义复杂数据类型”
  • 如果它是输入消息的打包程序:

    • 它为每个方法的输入参数都有一个元素。
    • 其名称与与其关联的操作的名称相同。
  • 如果它是输出消息的打包程序:

    • 它为每个方法的输出参数有一个元素,以及每个方法的 inout 参数的一个元素。
    • 其第一个元素代表方法的返回参数。
    • 其名称将通过将 Response 附加到与打包程序关联的操作名称来生成。

消息命名

合同中的每个消息都必须在其命名空间内具有唯一的名称。建议您使用以下命名约定:

  • 消息仅应由单个操作使用。
  • 输入消息名称通过将 Request 附加到操作名称来形成。
  • 通过向操作名称附加 Response 来形成输出消息名称。
  • 错误消息名称应该代表错误的原因。

消息部分

消息部分是逻辑消息的正式数据单元。每个部分都使用 part 元素定义,并由 name 属性标识,type 属性或指定其数据类型的元素属性。数据类型属性列在 表 3.1 “部分数据类型属性” 中。

表 3.1. 部分数据类型属性
属性描述

element="elem_name"

部分的数据类型由名为 elem_name 的元素定义。

type="type_name"

部分的数据类型由名为 type_name 的类型定义。

消息被允许重复使用部分名称。例如,如果方法有一个参数 foo,它通过引用或是 in/out 传递,则它可以是请求消息和响应消息的一部分,如 例 3.1 “重复使用部分” 所示。

例 3.1. 重复使用部分

<message name="fooRequest">
  <part name="foo" type="xsd:int"/>
<message>
<message name="fooReply">
  <part name="foo" type="xsd:int"/>
<message>

示例

例如,假设您有一个存储个人信息的服务器,并提供了一种方法,它根据员工的 ID 号返回员工的数据。查找数据的方法签名与 例 3.2 “personalInfo 查找方法” 类似。

例 3.2. personalInfo 查找方法

personalInfo lookup(long empId)

这个方法签名可以映射到 例 3.3 “RPC WSDL 消息定义” 中显示的 RPC 风格 WSDL 片段。

例 3.3. RPC WSDL 消息定义

<message name="personalLookupRequest">
  <part name="empId" type="xsd:int"/>
<message/>
<message name="personalLookupResponse>
  <part name="return" element="xsd1:personalInfo"/>
<message/>

它还可以映射到 例 3.4 “嵌套文档 WSDL 消息定义” 中显示的嵌套文档风格的 WSDL 片段。

例 3.4. 嵌套文档 WSDL 消息定义

<wsdl:types>
  <xsd:schema ... >
  ...
  <element name="personalLookup">
    <complexType>
      <sequence>
        <element name="empID" type="xsd:int" />
      </sequence>
    </complexType>
  </element>
  <element name="personalLookupResponse">
    <complexType>
      <sequence>
        <element name="return" type="personalInfo" />
      </sequence>
    </complexType>
  </element>
  </schema>
</types>
<wsdl:message name="personalLookupRequest">
  <wsdl:part name="empId" element="xsd1:personalLookup"/>
<message/>
<wsdl:message name="personalLookupResponse">
  <wsdl:part name="return" element="xsd1:personalLookupResponse"/>
<message/>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.