第 4 章 定义逻辑接口

摘要

逻辑服务接口通过 portType 元素进行定义。

概述

逻辑服务接口通过 WSDL portType 元素进行定义。portType 元素是抽象操作定义的集合。每个操作都由用于完成操作所代表的输入、输出和错误消息来定义。当生成代码来实施 portType 元素中定义的服务接口时,每个操作都会转换成一个方法,其中包含由合同中指定的参数、输出和错误消息。

Process

要在 WSDL 合同中定义逻辑接口,您必须执行以下操作:

  1. 创建一个 portType 元素,以包含接口定义,并为它指定唯一名称。请参阅 “端口类型”一节
  2. 为接口中定义的每个操作创建一个操作元素。请参阅 “操作”一节
  3. 对于每个操作,请指定用于代表操作参数列表、返回类型和异常的消息。请参阅 “操作消息”一节

端口类型

WSDL portType 元素是逻辑接口定义中的根元素。虽然许多 Web 服务实施直接将 portType 元素映射到生成的实现对象,但逻辑接口定义没有指定由实施的服务提供的确切功能。例如,名为 ticketSystem 的逻辑接口可导致一个实现,可以销售 concert ticket 或挂起问题单的问题。

portType 元素是 WSDL 文档的单元,映射到绑定中,以定义端点用来公开定义的服务所使用的物理数据。

WSDL 文档中的每个 portType 元素必须具有唯一的名称,使用 name 属性来指定,由一系列操作组成,它们在 操作 元素中描述。WSDL 文档可以描述任意数量的端口类型。

操作

使用 WSDL 操作元素定义的逻辑 操作,定义两个端点之间的交互。例如,对检查帐户余量的请求和跨小部件的订购都可以定义为操作。

portType 元素中定义的每个操作必须具有唯一的名称,使用 name 属性指定。定义操作需要 name 属性。

操作消息

逻辑操作由代表端点之间沟通的逻辑消息的一组元素组成,以执行该操作。表 4.1 “操作消息元素” 中列出了可描述操作的元素。

表 4.1. 操作消息元素

元素描述

输入

指定在发出请求时客户端端点发送到服务供应商的消息。此消息的部分内容对应于操作的输入参数。

output

指定服务提供商在响应请求时发送到客户端端点的消息。此消息的部分内容对应于服务提供商可更改的任何操作参数,例如通过引用传递的值。这包括操作的返回值。

fault

指定用于在端点之间通信错误条件的消息。

需要具有至少一个 输入 或一个 输出元素的操作。操作可以同时具有 输入和输出 元素,但每个元素只能有一个。操作不需要有任何 故障 元素,但在需要时也可具有任意数量的 故障 元素。

元素在 表 4.2 “输入和输出元素的属性” 中列出的两个属性。

表 4.2. 输入和输出元素的属性

属性描述

name

标识消息,以便在将操作映射到组件数据格式时引用它。名称必须在包含的端口类型内唯一。

message

指定描述正在发送或接收的数据的抽象信息。message 属性的值必须与 WSDL 文档中定义的其中一个抽象消息的 name 属性对应。

不需要为所有 输入和输出 元素指定 name 属性,而 WSDL 会根据包含操作的名称提供默认命名方案。如果操作中只使用一个元素,则元素名称默认为操作的名称。如果使用 输入和输出 元素,则元素名称将分别默认为带有 RequestResponse 附加到名称的操作的名称。

返回值

因为 operation 元素是操作期间传递的数据的一个抽象定义,所以 WSDL 不会提供为操作指定的返回值。如果方法返回一个值,它将映射到 output 元素,作为该消息的最后一个部分。

示例

例如,您可能有一个与 例 4.1 “personalInfo 查找接口” 中显示的接口类似。

例 4.1. personalInfo 查找接口

interface personalInfoLookup
{
  personalInfo lookup(in int empID)
  raises(idNotFound);
}

这个接口可以映射到 例 4.2 “personalInfo 查找端口类型” 中的端口类型。

例 4.2. personalInfo 查找端口类型

<message name="personalLookupRequest">
  <part name="empId" element="xsd1:personalLookup"/>
<message/>
<message name="personalLookupResponse">
  <part name="return" element="xsd1:personalLookupResponse"/>
<message/>
<message name="idNotFoundException">
  <part name="exception" element="xsd1:idNotFound"/>
<message/>
<portType name="personalInfoLookup">
  <operation name="lookup">
    <input name="empID" message="tns:personalLookupRequest"/>
    <output name="return" message="tns:personalLookupResponse"/>
    <fault name="exception" message="tns:idNotFoundException"/>
  </operation>
</portType>