查理哈哈
作者查理哈哈·2010-03-02 14:32
CIO·ww

使用 Informix 4GL 消费 Web 服务

字数 7246阅读 1867评论 0赞 0
通过让 IBM® Informix® 4GL (I4GL) 成为服务消费者,可以重用用 I4GL 或其他编程语言编写的现有的 Web 服务和业务逻辑。这样就可能使用 I4GL 以许多种方式与任何编程语言通信,同时仍然享有 I4GL 编程的便捷性。
google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);

  简介

  Informix 4GL (I4GL) 是一种快速开发工具,提供用于创建 Informix 数据库应用程序的简便语言支持。从 I4GL v7.50 开始,可以作为 Web 服务发布现有的 I4GL 代码,这样就可以从客户机应用程序访问自己的 I4GL 应用程序。

  本文是两篇解释如何使用 I4GL v7.50 Web 发布和预订特性的 developerWorks 文章的第二篇。第一篇 “以 Web 服务的形式部署 4GL 函数”(developerWorks,2009 年 2 月)解释了如何把 I4GL 函数部署为 Web 服务,讨论了面向服务体系结构 (SOA) 以及在 SOA 环境中使用 I4GL 的方法。本文在此基础上解释如何使用 I4GL 预订器预订 Web 服务。

  I4GL 作为 SOA 环境中的服务消费者

  面向服务体系结构 (SOA) 是一种体系结构风格,它让不同的应用程序可以相互交换数据。它的目标是实现服务与底层应用程序使用的操作系统编程语言和其他技术的松散耦合。

  在 I4GL 上实现 SOA 有助于尽可能利用组织内外大量现有应用程序中的业务逻辑。I4GL v7.50.xC2(于 2008 年 12 月发布)允许用户以 Web 服务的形式发布用 I4GL 编写的现有业务逻辑;这样,任何编程语言或应用程序都可以消费这些 Web 服务。v7.50.xC3(于 2009 年 5 月发布)进一步改进了这个 SOA 特性,支持使用 I4GL 消费 Web 服务。

  在 v7.50 之前,I4GL 开发人员在集成用 I4GL 和其他现代编程语言编写的业务逻辑和应用程序时面对许多困难。另外,一些组织试图在用多种语言编写的代码之间实现互操作,从而提高灵活性,但是他们只能用更新的技术重写 I4GL 代码。

图 1. I4GL-SOA 预订器的体系结构
使用 Informix 4GL 消费 Web 服务

  I4GL-SOA 预订器体系结构依赖于一个用户界面(即 W4GL)。用户从 Web 服务定义文件获得 Web 服务的信息,然后在 W4GL 界面中提供详细信息。W4GL 界面生成一个配置文件并把所有这些信息存储在其中。W4GL 界面把配置文件作为输入提供给后端脚本(即 W4GLC)。W4GLC 工具生成预订 Web 服务的中间客户机代码。

  前提条件

  要想使用 Informix I4GL 消费 Web 服务,必须使用以下平台之一:

  HP-IA 11.23 / 11.31(32/64 位)

  Red Hat Enterprise Linux® 4 或 5

  Solaris 5.9 / 5.10(32/64 位)

  SUSE Linux Enterprise Server 10

  系统上还必须有以下软件

  Apache Axis2/C, Version 1.5(及 Informix 4GL C Compiler 实现)

  Apache Axis2/Java™, Version 1.3.1(及 Informix 4GL C Compiler 实现)

  IBM Informix Dynamic Server, Versions 10.00、11.10 或 11.50

  Informix 4GL 7.50.xC3

  Java Runtime Environment (JRE) 1.5 或更高版本

  Perl 5.8.8 或更高版本

  设置环境

  表 1 说明必须设置的环境变量:

表 1. 设置环境变量

环境变量 设置为
AXIS2C_HOME Axis2C 安装目录。
INFORMIXDIR 安装 I4GL 产品的位置。
PROGRAM_DESIGN_DBS 存储通过 w4gl 工具输入的 Web 服务定义的数据库(可选)。

如果用户没有指定 PROGRAM_DESIGN_DBS,就使用 syspgm4gl 作为默认的数据库名。如果指定了 PROGRAM_DESIGN_DBS,就在启动 w4gl 工具时创建相关的表和模式。
INFORMIXSERVER PROGRAM_DESIGN_DBS 数据库所在的 Informix 服务器
INFORMIXSQLHOSTS sqlhosts 文件的位置。
LD_LIBRARY_PATH 共享库的路径。
PATH 包含可执行文件位置的路径。这个路径必须包含 $JAVA_HOME/bin。
JAVA_HOME JRE 1.5 或更高版本的安装位置。
DBPATH w4gl 工具使用的已编译表单文件的路径。它必须设置为 $INFORMIXDIR/etc。
AXIS_JAR_DIR AXIS 服务器使用的 .jar 文件的位置。要想启用 I4GL SOA 功能,必须有这些 jar 文件。
CLASSPATH I4GL SOA 功能所需的 jar 文件的绝对路径和名称。
DB_LOCALE 包含 Web 服务信息的数据库的位置。
CLIENT_LOCALE I4GL 客户机的位置(可选)。
TERMCAP $INFORMIXDIR/etc/termcap 路径(可选)。

  配置文件

  配置文件包含由 W4GL 工具生成的 Web 服务定义信息。清单 1 中的配置文件示例基于图 3 到图 5 所示的选项:

清单 1. w4gl 配置文件示例

[SERVICE] 
  TYPE = subscriber 
  I4GLVERSION = 7.50.xC3 
  TARGET_DIR = /tmp/zipcodedemo 
  I4GL_FUNCTION = cons_ws_zipcode 
  TARGET_FILE = cons_ws_zipcode.c 
  [WSDL_INFO] 
    WSDL_PATH = /tmp/zipcodedemo 
    WSDL_FILE = zipcode_details.wsdl 
    WSDL_NAME_SPACE= http://www.ibm.com/zipcode_details 
    [FUNCTION] 
      SERVICENAME = ws_zipcode 
      NAME = zipcode_details 
      [INPUT] 
        [VARIABLE]NAME = pin TYPE = CHAR(10)[END-VARIABLE] 
      [END-INPUT] 
      [OUTPUT] 
        [VARIABLE]NAME = city TYPE = CHAR(100)[END-VARIABLE] 
        [VARIABLE]NAME = state TYPE = CHAR(100)[END-VARIABLE] 
      [END-OUTPUT] 
    [END-FUNCTION] 
  [END-WSDL_INFO] 
[END-SERVICE] 

表 2. w4gl 配置文件关键字说明

关键字名称 说明
[SERVICE]
…..
[END-SERVICE]
这个块包含消费 Web 服务所需的参数集。
TYPE 服务操作,publisher 或 subscriber。
TARGET_DIR 生成的源代码和对象文件的目标目录。
I4GL_FUNCTION 用户定义的惟一的函数名,函数包含为消费 Web 服务自动生成的代码。I4GL 开发人员在 I4GL 程序中通过引用这个函数来消费指定的 Web 服务。
TARGET_FILE 用户定义的文件名,文件中存储通过工具生成的预订器客户机代码。
[WSDL_INFO]
….
[END-WSDL_INFO]
这个块包含从要消费的 Web 服务的 WSDL 文件获得的参数。
WSDL_PATH 下载的 WSDL 文件的目录位置。
WSDL_FILE 包含 Web 服务信息的 WSDL 文件。
WSDL_NAME_SPACE 一个统一资源标识符 (URI),它提供的惟一名称用于关联 XML 模式中的元素、属性和类型定义,或者关联 XQuery 表达式中的元素、属性、类型、函数和错误的名称。
[FUNCTION]
….
[END-FUNCTION]
这个块包含要消费的函数的信息。
SERVICENAME 要消费的服务的名称。
NAME 要消费的函数(WSDL 中的操作)的名称。
[INPUT]
….
….
[END-INPUT]
Web 服务函数的输入参数列表。
[OUPUT]
….
[END_OUTPUT]
Web 服务函数的输出参数列表。
[VARIABLE]
….
[END_VARIABLE]
这个块包含 Web 服务函数的输入和输出参数的变量名和对应的数据类型。
NAME 在服务定义中指定的标识输入和输出变量名的关键字。
TYPE 在服务定义中指定的标识输入和输出数据类型的关键字。

  工具

  可以使用 w4glc 或 w4gl 工具自动生成通过 I4GL 程序消费 Web 服务所需的代码。

  w4glc 工具

  这个命令行工具用于生成连接 Web 服务所需的代码。w4glc 工具需要一个配置文件作为输入。有经验的 I4GL 开发人员熟悉配置文件的语法,他们可以使用 w4glc 工具更快地生成代码。

清单 2. w4glc 语法

w4glc { [-silent] [-generate] [-compile] } <configuration_file>

  silent 抑制编译器生成的所有消息。

  generate 生成客户机源代码。

  compile 编译生成的源代码并创建对象文件。

  W4GL 工具

  正如 “以 Web 服务的形式部署 4GL 函数” 中指出的,W4GL 工具在程序设计数据库中管理数据。它还提供 Web 服务打包功能,这样就可以把服务转移到配置和平台相同的其他机器上。在数据库中存储数据之后,可以针对不同的平台使用 W4GL 生成相同的服务。

  W4GL 工具还提供可以生成配置文件和生成预订 Web 服务所需的中间 C 语言代码的界面。

  W4GL 工具的预订器选项菜单见图 2:

图 2. 层次化的 W4GL 工具预定者选项菜单
使用 Informix 4GL 消费 Web 服务

  查看原图(大图)

  使用 W4GL 工具有以下优点:

  它负责 Web 服务消费的全过程,这包括自动生成配置文件和对应的 C 语言消费者代码。

  通过这个工具指定的 WSDL 定义保存在数据库表中,以后可以重用和修改,这会减少开发工作量。

  这个工具使用大家熟悉的基于 I4GL 特点的界面分四步完成消费任务:

  添加 Web 服务。

  生成配置文件和中间消费者 C 代码。

  通过调用自动生成的代码中的函数预订 Web 服务。

  通过编译源代码创建并运行一个可执行文件。

  添加 Web 服务

  要想预订 Web 服务,首先必须通过选择 Subscribe > Add 添加 Web 服务定义。

  图 3 是添加 ws_zipcode Web 服务时的 Add 屏幕:

图 3. ws_zipcode Web 服务详细信息
使用 Informix 4GL 消费 Web 服务

  Subscription ID 字段是由 w4gl 工具生成的惟一标识号,用来跟踪 Web 服务定义。

  在 表 2 中可以找到对其他字段的说明。

  图 4 是 ws_zipcode Web 服务的输入和输出参数的 Variable 屏幕:

图 4. 添加 Web 服务的输入和输出参数信息
使用 Informix 4GL 消费 Web 服务 

  生成配置文件和预订器客户机代码

  分两步编译 Web 服务信息。在第一步中,w4gl 工具创建 w4glc 工具使用的配置文件。在第二步中,w4gl 工具在用户指定的目标目录中创建中间 C 语言代码并生成对象文件。

  图 5 是用于生成配置文件的 Subscribe 屏幕:

图 5. 生成配置文件
使用 Informix 4GL 消费 Web 服务

  图 6 是用于生成客户机代码的 Subscribe 屏幕:

图 6. 生成预订器客户机代码
使用 Informix 4GL 消费 Web 服务

  使用 I4GL 程序调用 Web 服务

  把 zipcode_details 函数部署为 Web 服务 “ws_zipcode”:

清单 3. 部署为 Web 服务的 I4GL 代码示例 (soademo.4gl)

FUNCTION zipcode_details(pin) 
  DEFINE recdtls RECORD 
      pin CHAR(10), 
      city CHAR(100), 
      state CHAR(100) 
    END RECORD, 
 
    pin CHAR(10), 
    sel_stmt CHAR(512); 
 
  LET sel_stmt= "SELECT * FROM statedetails WHERE pin = ?"; 
  PREPARE st_id FROM sel_stmt; 
  DECLARE cur_id CURSOR FOR st_id; 
  OPEN cur_id USING pin; 
  FETCH cur_id INTO recdtls.*; 
  CLOSE cur_id; 
  FREE cur_id; 
  FREE st_id; 
  RETURN recdtls.city, recdtls.state 
END FUNCTION 

  客户机可执行文件调用这个 Web 服务:

清单 4. 消费 4GL Web 服务的 I4GL 代码示例 (clssoademo.4gl)

MAIN 
  define retVal int; 
  let retVal = func_cons_ws_zipcode(); 
END MAIN 
 
FUNCTION func_cons_ws_zipcode() 
  DEFINE recdtls RECORD 
        pin CHAR(10), 
        city CHAR(100), 
        state CHAR(100) 
      END RECORD; 
 
  call cons_ws_zipcode("97006") returning recdtls.city, recdtls.state 
  DISPLAY "SUPPLIED ZIP CODE: 97006 n" 
  DISPLAY "RESPONSE FROM WEB SERVICE n" 
  DISPLAY " ------------------------- n" 
  DISPLAY " CITY:",state_rec.city 
  DISPLAY "n STATE:",state_rec.state 
  return 1 
END FUNCTION 

  通过编译源代码创建并运行一个可执行文件

  AXIS2/C 接收请求并调用 Web 服务 ws_zipcode,然后这个服务调用 4GL 函数 zipcode_details 并与 IDS 服务器通信,获得与邮政编码对应的城市名和州名。

清单 5. 语法

c4gl clsoademo.4gl cons_ws_zipcode.o -o zipcode_client - 
I${AXIS2C_HOME}/include/axis2-1.5.0 -L${AXIS2C_HOME}/lib -laxis2_engine - 
laxutil -laxis2_axiom 

  运行可执行文件 (zipcode_client)。返回值传输回客户机可执行文件。

清单 6. 语法

./zipcode_client 
 
SUPPLIED ZIP CODE: 97006 
RESPONSE FROM WEB SERVICE 
  ------------------------- 
   
  CITY:Beaverton 
   
  STATE:OR 

  结束语

  通过让 I4GL 成为服务消费者,可以重用用 I4GL 或其他编程语言编写的现有的 Web 服务和业务逻辑。这样就可以使用 I4GL 以多种方式与任何编程语言通信,同时仍然享有 I4GL 编程的便捷性。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广