跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

通过 DataStage ASB Packs V2.0 在 InfoSphere Information Server 中处理复杂的 Web 服务

分步指南

Santhosh Kotte, 系统软件工程师, IBM
Santhosh Kotte 的照片
Santhosh Kotte 在 IBM 位于印度海得拉巴的软件实验室的 IBM InfoSphere Information Server Group 担任系统软件工程师。他于 2007 年以助理软件工程师的身份加入 IBM。他主要负责 DataStage ASB Packs(XML Pack 2.0、Java Pack 2.0 和 Web Service Pack 2.0)以及下一代 Web Service Pack (WS Pack 3.0) 的开发和维护工作。他的主要兴趣是研究各种新兴技术,比如 XML、DB2 pureXML、SOA 和 Web 服务,以及探索各种信息集成技术。

简介: IBM InfoSphere DataStage ASB Packs V2.0(XML、Java 和 Web services Pack)是 DataStage 的组件,能够帮助用户更快地交付数据集成解决方案。本文通过调用复杂的 Web 服务并集成这些 Web 服务以及其他 DataStage 组件返回的数据,探索了 DataStage ASB Packs 提供的各种特性。DataStage Web Services Pack 本身并不能调用复杂的 Web 服务。本文详细解释了 Web Services Pack 和 XML Pack 的组合如何处理复杂的 Web 服务。本文还认真分析了复杂的 Web 服务的调用过程,其中涉及到 SSL 键储存/信任储存、WSDL 2.0 构造、带有 Username Token Authentication 信息和带有 Session Management 信息的 SOAP 头部、使用 XML Output Stage 将 Complex Arrays 作为 Input,以及使用 XML Input Stage 将 Complex Arrays 作为 Output。此外,本文还讨论了如何在 Tomcat 中配置 SSL、调试 SSL Web 服务和使用 SOAPUI 和 Tcpmon 组成 SOAP 头部。将通过样例 DataStage 作业和 Axis Web 服务解释了以上的所有特性。

发布日期: 2011 年 9 月 05 日
级别: 中级 原创语言: 英文
访问情况 : 3974 次浏览
评论: 


IBM InfoSphere Information Server 和 DataStage ASB Packs V2.0 简介

IBM InfoSphere DataStage ASB Packs V2.0(XML、Java 和 Web services Pack)是 DataStage 的组件,能够帮助用户更快地交付数据集成解决方案。本文通过调用复杂的 Web 服务并集成这些 Web 服务以及其他 DataStage 组件返回的数据,探索了 DataStage ASB Packs 提供的各种特性。DataStage Web Services Pack 本身并不能调用复杂的 Web 服务。本文详细解释了 Web Services Pack 和 XML Pack 的组合如何处理复杂的 Web 服务。本文还认真分析了复杂的 Web 服务的调用过程,其中涉及到 SSL 键储存/信任储存、WSDL 2.0 构造、带有 Username Token Authentication 信息和带有 Session Management 信息的 SOAP 头部、使用 XML Output Stage 将 Complex Arrays 作为 Input,以及使用 XML Input Stage 将 Complex Arrays 作为 Output。此外,本文还讨论了如何在 Tomcat 中配置 SSL、调试 SSL Web 服务和使用 SOAPUI 和 Tcpmon 组成 SOAP 头部。将通过样例 DataStage 作业和 Axis Web 服务解释了以上的所有特性。

IBM Information Server

IBM InfoSphere Information Server 是一个统一的综合信息集成中心。它概括、清理和转换来自异构数据源的数据,以生成一致的、精确的商业数据。如果要将 XML 数据与储存在后台企业资源规划(ERP)系统和其他数据分析应用程序中的数据进行集成和同步,那么 IBM Information Server 是一个理想的解决方案。

DataStage ASB Packs

ASB (Application Services Backbone) Pack 是帮助转换和集成 XML 和 Web 服务数据的 DataStage 插件组件。XML Pack v2.0、Web Services Pack v2.0 和 Java Pack v2.0 统称为 ASB Pack。

使用 Web Services Pack 可以访问 nfoSphere Information Server DataStage 作业中的 Web 服务操作。Web Services Pack 包括插件 Stage 和 WebSphere DataStage Server 例程中的额外功能。要了解 DataStage Web Services PACK 作业是如何设计的,请参阅 http://www.ibm.com/developerworks/data/library/techarticle/dm-0912dominoappsinfosphere 上的 developerWorks 文章。

使用 XML Pack v2.0 可以进行 XML 和关系数据之间的转换。XML Input Stage 将 XML 数据转换成关系数据。而 XML Output Stage 则将关系数据转换成 XML 数据。XML Transformer Stage 对 XML 数据应用样式表并将其转换成 HTML 数据。在本文中,我们仅使用 XML Input 和 XML Output Stages。

使用 Java Pack v2.0 可以调用使用来自 DataStage 的 Java Pack API 开发的外部 Java 应用程序。本文不使用 Java Pack。

Web 服务概述

Web 服务是可以通过 Internet 发送消息调用的远程操作集合。Web 服务提供商发布 Web 服务供用户查询和使用,而 Web 服务客户则通过服务来调用操作。Web 服务提供商提供一个用于定义服务接口的 WSDL (Web Services Description Language) 文档。WSDL 文档的格式为 XML。接口背后的逻辑取决于提供商,但大部分提供商都通过受支持的语言将该接口映射到过程调用。客户输入的请求经过底层代码,得到的结果传递回给客户。

简单和复杂的 Web 服务

简单的 Web 服务

简单的 Web 服务有以下特征。

  • 单行输入,单行输出
  • 通过没有安全性的 HTTP 部署
  • 缺少防火墙
  • 使用基本类型的 WSDL

复杂的 Web 服务

复杂的 Web Services 通常至少具有以下特征之一,但不局限于这些特征。

  • SSL 身份验证
  • 使用多行输入
  • 使用多行输出
  • 输出和输出都是多行
  • 使用用户名令牌身份验证的 SOAP 头部
  • 使用会话 ID 信息的 SOAP 头部
  • 使用复杂类型的 WSDL

DataStage Web Services Pack 不能直接调用复杂的 Web 服务。它需要与 XML Pack 和其他工具(比如 SOAPUI 和 Tcpmon)一起使用才能调用复杂的 Web 服务。本文详细阐述了 DataStage ASB Packs V2.0 中可用于调用上面列出的部分复杂 Web 服务的选项。

先决条件

建议读者在尝试本文后面描述的场景之前先阅读以下文章。

请阅读文章 创建 DataStage Web Service Pack 作业

请阅读文章 创建 DataStage XML Pack 作业

SSL 身份验证

安全性是 Web 服务实现的重点考虑之一。在不安全的环境中,SOAP 消息是以纯文本的形式在网络中传输的,因此只要使用探测器,任何人都能够拦截 SOAP 消息并阅读其内容。为了避免这种情况的发生,Web 服务必须使用 SSL 提供安全保护。SSL 和 TLS 协议已经成为保护网络通信安全的实际标准。这些协议提供机密性、身份验证和消息完整性。为了实现该目标,必须使用由证书机构发出的数字证书启用 SSL。Web 服务客户端需要证书细节来调用 Web 服务。SSL 和 TLS 协议定义 SSL 客户端和服务器用于彼此间通信的规则。这些规则指定消息发送的顺序、每条消息的格式以及对网络通信应用加密算法的方式。

DataStage Web Services Pack v2.0 中的 SSL 身份验证

为了访问通过 HTTPS DataStage 部署的 Web 服务,Web 服务客户端应该从Web 服务容器获取服务器证书,然后使用密匙工具创建一个密匙储存文件并将服务器证书导入到该文件中。必须在 Web Service Client->Stage Tab->Security Tab 中添加生成的密匙存储文件的路径。检查 SSL Encryption Required> 选项并在 Keystore File 选项中添加密匙储存文件的路径。在这个样例中,在 Tomcat 上启用了 SSL 并通过它部署了 Axis Web 服务。

请参考链接 http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html 了解在 Tomcat 服务器中配置 SSL 的细节。

请在 SSL 功能的附件中参考名为 WS_SSL 的作业


Web Service Pack 中的 SSL 身份验证
Web 服务客户端 SSL 选项

调试 SSL Web 服务

SSL 给 Web 服务客户端-服务器通信带来额外的复杂性。要了解 SSL 连接问题有时可能很困难,尤其是不明确实际要发送和接收的消息时。在 JVM 属性 javax.net.debug 的帮助下,我们可以开启 SSL 套接字通信调试选项。调试输出消息能够帮助您了解 SSL 层到底发生了什么问题。要在 Web Service Pack 中启用 SSL 调试,请在 Web Service Client(Grid Style)->Stage Tab->Properties Tab->JVM Options 中添加 JVM 选项 -Djavax.net.debug,并将其值设置为 true。当 DataStage 作业编译完成并运行之后,可以在 Director Log 中查看 SSL 调试日志消息。


Web Service Pack 中的 SSL 调试
SSL 调试

清单 1. Director Log 中的 SSL 调试消息
				
setting up default SSLSocketFactory
use class specified by ssl.SocketFactory.provider: com.ibm.jsse2.SSLSocketFactoryImpl
class com.ibm.jsse2.SSLSocketFactoryImpl is loaded
init keymanager of type IbmX509
IBMJSSEProvider Build-Level: -20090329
keyStore is: C:\\IBM\\InformationServer\\ASBNode\\apps\\jre\\lib\\security\\cacerts
keyStore type is: jks
keyStore provider is: 
init keystore
trustStore is: C:\\ComplexWebServices\\SSL_WebService\\tomcatkeystore
trustStore type is: jks
trustStore provider is: 
init truststore
adding as trusted cert:
  Subject: CN=santhosh, OU=ibm, O=ibmisl, L=hyd, ST=ap, C=91
  Issuer:  CN=santhosh, OU=ibm, O=ibmisl, L=hyd, ST=ap, C=91
  Algorithm: RSA; Serial number: 0x4bd97c41
  Valid from Thu Apr 29 18:02:01 IST 2010 until Wed Jul 28 18:02:01 IST 2010


以上的 SSL 调试消息显示了重要的信息,比如 SSLSocketFactory 的类型、keystore/truststore 的类型、用于加密的算法 (RSA) 以及证书的有效性等。

请参考 Web Service Pack 中用于 SSL 调试选项的 WS_SSL_Dbg 作业。

使用复杂的 SOAP 头部的 Web 服务

SOAP 头部

SOAP (Simple Object Access Protocol) 是一个供 Web 服务使用的、基于 XML 的通信协议。Web 服务通信是通过 SOAP 消息来执行的。应用程序(通常为 Web 服务客户端)通过向 Web 服务发送一个 SOAP 请求来调用它,而 Web 服务通过发送一个 SOAP 响应对该应用程序作出响应。由 root Envelope 元素组成的 SOAP 请求是一个 XML 文档。Envelope 元素包含一个强制的 Body 元素和一个可选的 Header 元素。Body 元素包含 Web 服务将要处理的信息,而 Header 元素包含特定于应用程序的信息,比如身份验证数据和会话数据等。

带有安全用户名令牌信息的 SOAP Header

组成 SOAP Header 头部的用户名令牌信息

Apache Rampart 是实现基于 Apache WSS4J 的 WS-Security 功能的 Axis2 模块。当用户需要访问服务时,WS-Security 提供多种验证用户身份的方式。其中一种简单的机制是使用用户名令牌。在用户名令牌身份验证中,用户的机密信息储存在 SOAP 头部。用户名令牌的目的仅是将用户名和密码信息作为 WS-Security 头部的一部分来传递。用户名令牌的最基础形式同时以纯文本的形式发送用户名和密码。

Web Service Pack v2.0 本身不能构成 SOAP 头部信息。要访问 Web 服务,用户必须预先创建 SOAP 头部。创建 SOAP 头部的方式之一是从第三方 Web 服务客户端调用 Web 服务,使用 TCPMON 捕捉 SOAP 请求并从该请求获取 SOAP 头部。然后,使用从 Web Service Client Stage 获取的头部来调用 Web 服务。我使用过 Axis2 UsernameToken Sample Services,您可以通过 http://wso2.org/library/240 找到它。按照链接的说明生成和部署 Web 服务。您可以运行提供的样例 Axis2 客户端来服务 Web 服务。为了捕捉 SOAP 请求,请使用 TCPMON。请参考链接 http://ws.apache.org/commons/tcpmon/tcpmontutorial.html 了解 TCPMON 及其用法。下面是带 SOAP 请求和响应的 TCPMON 的屏幕截图。


带 SOAP 请求和响应的 TCPMON
带 SOAP 请求和响应的 TCPMON

从 Web Services Pack 调用用户名令牌 Web 服务

以上的步骤捕捉到包含用户名令牌的头部信息。Web Services Pack 规定必须显式地在 Stage 中提到 SOAP 头部。切换到 Web Service Client > Output Tab > Input Arguments 并插入一个名为 SOAPHEADER 的新请求值。在 value 字段提及/复制 SOAP 头部信息并勾选 Header 复选框。编译并运行 DataStage 作业。Web Service Client 将通过从用户在 Web Service Stage Properties 中定义的 SOAP 头部组成完整的 SOAP 请求来调用 Web 服务。


Web Service Client Stage:SOAP Header 选项
Web Service Client Stage:SOAP Header 选项

Web Service Client Stage:SOAP Header 选项
Web Service Client Stage:SOAP Header 选项

下面是 DataStage Web Services Pack 生成的完整 SOAP 请求。


清单 2. 在 SOAP 头部中包含用户名令牌信息的的 SOAP 请求
				
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
            wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-63046594" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
            wss-wssecurity-utility-1.0.xsd">
<wsse:Username>bob</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-
        username-token-profile-1.0#PasswordDigest">rW9ziD+5CnOrXZ4kxErEMJvs9y8=
            </wsse:Password>
<wsse:Nonce>nATeerIJqyHxHEOyKsRFvg==</wsse:Nonce>
<wsu:Created>2010-02-05T12:24:59.718Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security> 
</soapenv:Header>
<soapenv:Body><ns1:echo 
xmlns:ns1="http://sample02.samples.rampart.apache.org" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:param0>THIS IS A SAMPLE USERNAME TOKEN SERVICE</ns1:param0></ns1:echo> 
</soapenv:Body>
</soapenv:Envelope>

请参考该场景的附件中名为 WS_UserNameToken 的作业。

包含用户会话信息的 SOAP 头部

请考虑下面的 Web 服务调用场景。

使用用户名/密码首次调用 Web 服务将返回用户会话 ID。

第二次 Web 调用必须使用第一次从 Web 服务获取的会话 ID 组成 SOAP 头部来完成。

第二次 Web 服务响应才包含 Web 服务返回的实际信息。这是一个使用基于 CRM 和 SaaS Web 服务(比如 SalesForce.com)的场景。

对 Web 服务的首个调用正常不需任何头部。为了使用来自第一个调用的会话 ID 进行第二个调用,我们需要一个名为 soapUI 的第三方 Web 服务。使用 soapUI 时,我们需要配置将用于 Web Service Client Stage 的 SOAP 头部的组成和层次结构。

使用 soapUI 查找 SOAP 头部

启动 soapUI 可执行程序。通过单击 File->New soapUI Project 创建新的 soapUI 项目。提供一个项目名(我使用的是 SessionProject),浏览寻找 Web 服务的 WSDL 文件并单击 ok。


soapUI 项目
soapUI 项目

soapUI 将加载 WSDL 定义并在左边的面板显示受支持的 Web 服务的层次结构视图。


soapUI Web 服务操作
soapUI Web 服务操作

为了检查 SOAP 请求的结构,尤其在是 SOAP 头部中,请单击层次结构视图的操作名下的 Request 选项。SOAP 请求包含将要显示在右边面板中的 SOAP 头部。


带头部的 soapUI SOAP 请求
带头部的 soapUI SOAP 请求

提取 SOAP 头部并将其作为 Web Service Client Stage 中的 Header Element 的一部分,就像前面用户名令牌场景一样。编译并运行 Web 服务客户端作业。

请参考该场景的附件中名为 sf_login,sf_columns and sf_xml 的作业。

多行作为 Web 服务的输入

多行作为 Web 服务的输入:正常操作

Web Services Pack 发送请求,每次向 Web 服务发送一行,这些行在 SOAP 消息中是加密的。在最简单的情况下,Web 服务操作希望接收一个参数作为操作的输入,而输入数据包含的行只有一个值。每行都在独立的请求中进行处理。将每行作为一个独立的 SOAP 请求发送导致巨大的性能损害,因为它涉及到以下操作。

  • 为每个输入行组合 SOAP 请求
  • 调用 Web 服务
  • 获取 SOAP 响应
  • 解析 SOAP 响应 XML 并获取响应值

考虑一个仅接受一行并对其进行某些处理的 Web 服务。如果 Web Services Pack 有 5 个行调用该 Web 服务,那么将创建 5 个对应的 SOAP 请求,并且进行 5 次 Web 服务调用。下面是 DataStage 作业及其对应的 Director 日志。我们可以看到有 5 个对应的 SOAP 请求和响应。


Web Services Stage:多行作为输入
Web Services Stage:多行作为输入

清单 3. 带 SOAP 消息日志功能的 Director 日志
				
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0029':'
[WebService] ---- XML request envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0030':'
[WebService] ---- XML response envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0029':'
[WebService] ---- XML request envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0030':'
[WebService] ---- XML response envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0029':'
[WebService] ---- XML request envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0030':'
[WebService] ---- XML response envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0029':'
[WebService] ---- XML request envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0030':'
[WebService] ---- XML response envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0029':'
[WebService] ---- XML request envelope ---- (...)
ConsumeRows,0: Info: WSPACK_InputRowsWithoutXMLOutput.ConsumeRows: 0030':'
[WebService] ---- XML response envelope ---- (...)


清单 4. 为每个独立行创建的 SOAP 请求
				
FOR THE FIRST ROW
#########################################################
<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:ConsumeRows 
xmlns:ns1="http://RowConsumer.MultipleRowsAsInput.isd.ibm.com/soapoverhttp/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<arg1>
<RowConsumerInVar1><field001>row1</field001><field002>the first sentence</field002>
</RowConsumerInVar1>
</arg1>
</ns1:ConsumeRows>
</soapenv:Body>
</soapenv:Envelope>

FOR THE SECOND ROW
#########################################################
<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:ConsumeRows 
xmlns:ns1="http://RowConsumer.MultipleRowsAsInput.isd.ibm.com/soapoverhttp/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<arg1>
<RowConsumerInVar1><field001>row2</field001><field002>the second sentence</field002>
</RowConsumerInVar1>
</arg1>
</ns1:ConsumeRows>
</soapenv:Body>
</soapenv:Envelope>

**********************AND SO ON FOR THE REMAINING THREE ROWS

请参考这个创建的附件中名为 WS_ArrarInv1 的作业。

下面的小节将介绍如何使用 XML Output Stage 创建 SOAP 主体。

多行作为 Web 服务的输入:使用 XML Output Stage 进行改善

XML Output Stage 一个 DataStage 插件,并且是 XML Pack 2.0 的一部分。XML Output Stage 从关系数据生成 XML 数据。在这里将使用 Output Stage 创建 SOAP 主体,方法是从平面文件将 5 个行集合起来,然后将这个 SOAP 主体传递到 Web Service Stage,以创建完整的 SOAP 请求。下面是相应的作业设计。


使用 XML Output Stage 将多行作为输入
使用 XML Output Stage 将多行作为输入

为了创建 SOAP 主体,需要将平面文件数据传递到 XML Output Stage。使用从对应的 Web 服务 WSDL 文件导入的 Web 服务定义填充 XML XML Output Stage。在 Repository > DataStage Project Name > Table Definitions > Web Services > Web Service Name(在我的例子中为 RowConsumer)的 DataStage Designer 中可以找到导入的 Web 服务定义。必须用来填充 XML Output Stage 的表定义的形式为 OperationName_IN(在本例中为 ConsumeRows_IN)。


WSDL 定义
WSDL 定义

Peek Stage 用于查看 Director Log 中来自 XML Output Stage 的进入消息。这不是强制的。SOAP 主体将作为在 XML Output Stage > Output Tab > Columns Tab(在本例中为 SoapBody)定义的列的一部分。


XML Output Stage 的 Output Tab 的 SOAP Body 列
XML Output Stage 的 Output Tab 的 SOAP Body 列

通过 Peek Stage 的 Output Link 将 SOAP Body 提供给 WS Client Stage。通过使用所提供的 WSDL 导入 Web 服务定义使用标准过程装载 WS Client 的 Stage Properties。在 WS Client Stage 中 Input Tab > Input Message Tab检查名为 user defined message 的选项并选择包含 SOAP 主体(在本例中为 SOAPBody)的列。


包含 SOAP 主体的列
包含 SOAP 主体的列

编译并运行该作业。在 Director 日志中可以看到 WS Client Stage 仅发送一条 SOAP 请求,而不是 5 条。XML Output Stage 将 SOAP 主体的 5 个行合并在一起并传递到 WS Client。WS Client 使用 SOAP 主体来创建完整的 SOAP 请求并调用 Web 服务。通过这种方式能够消除创建 SOAP 请求和为每个单独的行调用 Web 服务导致的开销。


清单 5. XML Output Stage 生成的 SOAP 主体
				
<?xmlversion="1.0"encoding="UTF-8"?>
<ns1:ConsumeRowsxmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://RowConsumer.MultipleRowsAsInput.isd.ibm.com/soapoverhttp/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<arg1>
<RowConsumerInVar1>
<field001>row1</field001><field002>thefirstsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row2</field001><field002>thesecondsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row3</field001><field002>thethirdentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row4</field001><field002>thefourthsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row5</field001><field002>thefifthsentence</field002>
</RowConsumerInVar1>
</arg1>
</ns1:ConsumeRows>

下面是 WS Client Stage 生成的完整 SOAP 请求。


清单 6. WS Client Stage 生成的 SOAP 请求
				
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body><ns1:ConsumeRows
xmlns:ns1="http://RowConsumer.MultipleRowsAsInput.isd.ibm.com/soapoverhttp/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<arg1>
<RowConsumerInVar1>
<field001>row1</field001>
<field002>thefirstsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row2</field001>
<field002>thesecondsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row3</field001>
<field002>thethirdsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row4</field001>
<field002>thefourthsentence</field002>
</RowConsumerInVar1>
<RowConsumerInVar1>
<field001>row5</field001>
<field002>thefifthsentence</field002>
</RowConsumerInVar1>
</arg1>
</ns1:ConsumeRows> 
</soapenv:Body>


请参考这个场景的附件中名为 WS_ArrayInv2 的作业。

作为输出处理来自 Web 服务的多行

来自 Web 服务的多行作为输出:正常操作

Web Service Pack 不能将多行作为输出。它每次仅能从 Web 服务响应获取一行。Web 服务返回一条 SOAP 消息,Web Services Client Stage 使用 XPath 表达式将其解码为一个输出行的多个列。如果想要将 SOAP 消息解码为多个行,则必须使用 XML Input Stage。

考虑这样一个 Web 服务,它在其响应中将 5 个雇员的数据作为输出发送。在正常的操作中,Web Service Pack 将仅获取一个行作为输出。


多行作为输出
多行作为输出

请参考这个场景的附件中名为 WS_ArrayOutv1 的作业。

来自 Web 服务的多个行:使用 XML Input Stage 改善

XML Input Stage 是一个 DataStage 插件,并且是 XML Pack 2.0 的一部分。它解析 XML 数据并生成关系数据。在这里将从 Web Service Client 而不是平面数据获取 SOAP 主体 XML,并将该 XML 传递给 XML Input Stage,以将其转换成成行和列。


使用 XML Input Stage
使用 XML Input Stage

SOAP 主体直接发送给 XML Input Stage 而不需要任何解码。要实现该目的,在接收 Stage(上面的 Peek Stage)的输入链接中定义一个列。在 Web Services Client stage 的 Output 选项卡上,单击 Output Message 选项卡。单击 User-Defined Message 复选框。在 Choose the Column Receiving the User Message 下拉列表中,选择在将接收输出消息的链接 Stage 中定义的列。


保存 SOAP 响应体的列
保存 SOAP 响应体的列

接收 SOAP 主体的列
接收 SOAP 主体的列

将这个包含 SOAP 主体的列通过 Peek Stage 传递给 XML Input Stage(Peek Stage 为非强制,也可以直接传递)。为了在 XML Input Stage 中解析这个 SOAP 主体 XML,需要使用 SOAP 主体 XML 表定义填充 XML Input Stage。为此,使用出现在 Repository > Project Name > Table Definitions > Web Services > Web Service Name 中的名为 operation_OUT 的表定义。在本例中为 EmpData_OUT


WSDL 定义
WSDL Definitions

通过使用 Sequential File Stage 链接 XML Input Stage 完成作业设计,从而在文本文件中捕捉平面的 SOAP 主体数据。保存该作业,编译并运行它。可以看到 WS Client Stage 捕捉到 SOAP 主体并传递给 XML Input Stage 以转换成行和列。


清单 7. WS Client Stage 捕捉到的 SOAP 响应体
				
<?xml version="1.0" encoding="UTF-8"?>
<p725:EmpDataResponse xmlns:p725="http://EDataSer.EmpData.isd.ibm.com/soapoverhttp/">
<EmpDataReturn>
<EDataSerOutVar1>
<empid>1123</empid><empname>John Millers</empname>
<empage>24</empage><empdept>Sales</empdept>
<emploc>Los Angeles</emploc>
</EDataSerOutVar1>
<EDataSerOutVar1>
<empid>1133</empid><empname>Mike Gordon</empname>
<empage>26</empage><empdept>Production</empdept>
<emploc>Chicago</emploc>
</EDataSerOutVar1>
<EDataSerOutVar1>
<empid>1143</empid><empname>Ruez Xavier</empname>
<empage>28</empage><empdept>Quality Assurance</empdept>
<emploc>Las Vegas</emploc>
</EDataSerOutVar1>
<EDataSerOutVar1>
<empid>1153</empid><empname>Gary Sobers</empname>
<empage>30</empage>
<empdept>Finance</empdept>
<emploc>Hong Kong</emploc>
</EDataSerOutVar1>
<EDataSerOutVar1>
<empid>1163</empid><empname>Ian Smith</empname>
<empage>32</empage>
<empdept>Documentation</empdept>
<emploc>Singapore</emploc>
</EDataSerOutVar1>
</EmpDataReturn>
</p725:EmpDataResponse>


清单 8. XML Input Stage 生成的扁平数据
				
"1123","John Millers","24","Sales","Los Angeles"
"1133","Mike Gordon","26","Production","Chicago"
"1143","Ruez Xavier","28","Quality Assurance","Las Vegas"
"1153","Gary Sobers","30","Finance","Hong Kong"
"1163","Ian Smith","32","Documentation","Singapore"

请参考该场景的附件中名为 WS_ArrayOutv2 的作业。

输入和输出都使用多行

输入和输出都使用多行:使用 XML Input Stage 和 XML Output Stage

在这个场景中,我们需要结合使用上面的两个场景知识。通过将来自 Web 服务 SOAP 请求中将要发送的平面文件数据的输入行使用 XML Output Stage 合并 SOAP 请求体,然后使用 XML Input Stage 解析 SOAP 响应体 XML 并将其转换成行和列。


使用 XML Input 和 XML Output Stage
使用 XML Input 和 XML Output Stage

清单 9. 由 XML Output Stage 组成的 SOAP 请求体
				
<soapenv:Body>
<ns1:UpperCase xmlns:ns1="http://CaseConv.MultipleRowsInOut.isd.ibm.com/soapoverhttp/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<arg1>
<CaseCoversionInVar1>
<field001>row1</field001>
<field002>the first sentence</field002>
</CaseCoversionInVar1>
<CaseCoversionInVar1>
<field001>row2</field001>
<field002>the second sentence</field002>
</CaseCoversionInVar1>
<CaseCoversionInVar1>
<field001>row3</field001>
<field002>the third sentence</field002>
</CaseCoversionInVar1>
<CaseCoversionInVar1>
<field001>row4</field001>
<field002>the fourth sentence</field002>
</CaseCoversionInVar1>
<CaseCoversionInVar1>
<field001>row5</field001>
<field002>the fifth sentence</field002>
</CaseCoversionInVar1>
</arg1>
</ns1:UpperCase> 
</soapenv:Body>



清单 10. XML Input Stage 捕捉到的 SOAP 响应体
				
<soapenv:Body>
<p266:UpperCaseResponse xmlns:p266="http://CaseConv.
            MultipleRowsInOut.isd.ibm.com/soapoverhttp/">
<UpperCaseReturn>
<CaseCoversionOutVar1>
<field001>ROW1</field001>
<field002>THE FIRST SENTENCE</field002>
</CaseCoversionOutVar1>
<CaseCoversionOutVar1>
<field001>ROW2</field001>
<field002>THE SECOND SENTENCE</field002>
</CaseCoversionOutVar1>
<CaseCoversionOutVar1>
<field001>ROW3</field001>
<field002>THE THIRD SENTENCE</field002>
</CaseCoversionOutVar1>
<CaseCoversionOutVar1>
<field001>ROW4</field001>
<field002>THE FOURTH SENTENCE</field002>
</CaseCoversionOutVar1>
<CaseCoversionOutVar1>
<field001>ROW5</field001>
<field002>THE FIFTH SENTENCE</field002>
</CaseCoversionOutVar1>
</UpperCaseReturn>
</p266:UpperCaseResponse>
</soapenv:Body>

请参考这个场景的附件中名为 WS_ArrayInOutv1WS_ArrayInOutv2 的作业。

本文首先介绍了 IBM InfoSphere Information Server、DataStage ASB Pack 以及简单的和复杂的 Web 服务。后面部分详细解释了如何调用通过 SSL 部署的复杂 Web 服务、SOAP 请求中需要头部信息的 Web 服务、接受多行作为输入的 Web 服务、输出中返回多行的 Web 服务,以及后两种服务组合成的服务。所有场景都使用 DataStage 作业进行详细解释,同时还提供了相应的屏幕截图。



下载

描述名字大小下载方法
本文使用的 DataStage 作业ArticleJobs.zip32KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

讨论

关于作者

Santhosh Kotte 的照片

Santhosh Kotte 在 IBM 位于印度海得拉巴的软件实验室的 IBM InfoSphere Information Server Group 担任系统软件工程师。他于 2007 年以助理软件工程师的身份加入 IBM。他主要负责 DataStage ASB Packs(XML Pack 2.0、Java Pack 2.0 和 Web Service Pack 2.0)以及下一代 Web Service Pack (WS Pack 3.0) 的开发和维护工作。他的主要兴趣是研究各种新兴技术,比如 XML、DB2 pureXML、SOA 和 Web 服务,以及探索各种信息集成技术。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=755764
ArticleTitle=通过 DataStage ASB Packs V2.0 在 InfoSphere Information Server 中处理复杂的 Web 服务
publish-date=09052011
author1-email=sankotte_cnnew1@in.ibm.com
author1-email-cc=