代理实现新 Web service - 详细

这是典型的端对端场景的概述,在该场景中,代理实施 Web service。

现有的基于 C 或 Cobol 的系统提供某些业务逻辑,该系统能有效地展示为 Web service。

代理具有某种机制,调用对现有系统的操作(也就是,系统展示到代理的接口)。 通常,将为 WebSphere MQ 启用现用系统,这意味着它会接收包含应用程序数据的 MQ 消息、将这些消息分派到底层执行,然后打包成返回值作为 MQ 响应。提供到这些现有操作的数据结构,以及这些操作返回的数据结构定义在 C 头文件或 COBOL 副本中。

Web service 在现有系统已展示的操作的基础上提供接口。 此接口可能包括所有现有操作、这些操作的某个子集和/或合成操作。

要定义您的接口:
  1. 查看现有系统提供的业务功能
  2. 选择此业务功能要展示的子集
  3. 决定在接口中的表示方法(表示为许多离散的操作,还是表示为较少的多用途操作)
一个基本决策是,Web service 接口采用 RPC 样式还是文档样式。 (请参阅Web service、WSDL 和消息流WSDL 与消息模式的关系)。
  • RPC 样式的接口通常设计为映射到某个 API 提供的一组底层的操作,且各个操作(方法调用)具有相当小的有效内容。
  • 文档样式的接口可能具有较少的操作,但每项操作的有效内容较大 - 例如,可能是表示借贷请求的文档。
WS-I(请参阅 http://www.ws-i.org/) 建议只使用文档样式的 WSDL,但许多较老的 Web service 使用 RPC 样式。

要执行该方案:

  1. 导入现在的 API 数据结构(例如,使用 C 导入器)。如果要使用文档类型的 WSDL,您必须在代理模型中用导入器向导创建所需的全局元素。WS-I 建议,Web service 有效内容的名称空间应是限定的,因此用户应在导入时指定目标名称空间。

    在该阶段,您已有要用于调用现有操作的数据的消息模型。

  2. 生成 WSDL 定义。除非您已创建了必需的消息类别,否则请为 每个要展示的 Web service 操作创建一个消息类别,并将现有代理消息与相应的 SOAP 角色(输入、输出或故障)相关联。 (请参阅使用消息类别文件
    • 如果您选择了文档样式的 WSDL,不会修改消息集本身。
    • 如果您选择了 RPC 样式的 WSDL,会创建与每项 WSDL 操作的请求和响应相对应的消息,并自动添加到消息集
  3. WSDL 生成步骤将导致相应的 SOAP mxsd(消息定义文件)自动包含在消息集中。具体地讲,这包括 SOAP 封包 mxsd 和 SOAP 解码 mxsd(如果 WSDL 样式是 RPC 编码)。
  4. 如果您要创建新的 Web Service 客户机,请使用通过选定 Web Service 客户机技术生成的 WSDL。通过非 WebSphere Message Broker 的工具做到这点,例如 Rational Application Developer 或 .NET。
  5. 执行消息流以接收 Web service 请求,即,作为 Web service 提供程序。根据客户机使用的传输,端点节点为 HTTP 或 MQ。 输入节点属性如下:
    • 域:“MRM”
    • 集:包含 SOAP 封包定义的消息
    • 类型:“封包”
    • 格式:“XML1”
  6. 当流调用解析器时,解析器会创建一个包含 SOAP 封包的逻辑树,如同 pre-canned SOAP mxsd 定义的。在 SOAP 封包(SOAP 体和头)中的连接点上解析自动继续进行,试图与消息集中的其他消息定义相匹配。在输入节点应用验证(如果需要)。

    在该阶段,您已有逻辑树,但是却不知道已接收的 SOAP 有效负载的内容。您可以查看 HTTP SOAPAction/action 字段以确定可能的内容,但该操作仅用于 HTTP。(WS-I 不建议使用 SOAPAction。)

  7. 您可以在现有系统中,提供从允许的有效内容消息到必需消息的映射。 例如,您可以有一个单一映射定义,消息 message1amessage1b 均映射到相同的目标 message2
    或者,可以为每个消息类型或相关消息类型的组提供单独的映射。此方法可能提高映射定义的可管理性和可复用性。 但缺点是用户必须确定已接收到的有效负载,然后才能应用映射。这可以在 ESQL 中执行,如下所示:
     
     DECLARE SOAPENV NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
     SET contentType = FIELDNAME(InputBody.SOAPENV:Body.*[<]);
     IF (contentType = ‘foo’) ...
     
    or using a field reference, for example:
     
     DECLARE R REFERENCE TO InputRoot.MRM.SOAPENV:Body.*[<];
     IF (FIELDNAME(R) = “foo”) ...
     
    之后,既然内容已知,流可能相应地分支(例如,使用 RouteToLabel 节点),每个分支具有特定于内容的 Mapping 和/或 Compute 节点。 对于简单流,所有逻辑可能保存在单个 Compute 节点中(如果需要)。

    立即调用现有系统(通常在 WebSphere MQ 上)、检索任何预期响应并传播 Web service 应答。数据流设计器必须考虑到业务应用程序在合理的时间段内不发送预期响应的可能性。

有关类似的场景,请参阅样本:Web Service 主机样本

相关概念
Web service、WSDL 和消息流
代理调用现有的 Web service
代理实现新的 Web service 接口
代理实现现有 Web service 接口
代理实现新 Web service 的非 Web service 接口
相关任务
代理实现现有的 Web service - 详细
代理调用现有的 Web service - 详细
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac34570_