第 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 “部分数据类型属性” 中。
属性 | 描述 |
---|---|
部分的数据类型由名为 elem_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>
Example
例如,假设您有一个存储个人信息的服务器,并提供了一种方法,它根据员工的 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/>