IBM Support

IBM i 上的CGI: 编写基于ILE C的CGI程序的6个步骤

Technical Blog Post


Abstract

IBM i 上的CGI: 编写基于ILE C的CGI程序的6个步骤

Body

通用网关接口(CGI)是一个绝大多数Web服务器都支持的标准,该标准定义了Web服务器与外部程序之间交换信息的方式。


CGI程序负责处理从浏览器端接收到的数据。例如,一个用户在填写完一个表单并且提交给服务器后,服务器将按照以下步骤调用CGI程序进行处理:

  • Web服务器接收HTTP请求;

  • HTTP请求中的通用资源标志符(URI)指定该请求的处理方式;

  • 根据URI的指示,服务器将进行文件传输,或者通过CGI程序来处理该请求。


IBM i上的CGI程序同样可以调用为AIX编写的CGI程序。这是因为编译后的二进制文件将直接通过IBM i的便携式解决方案应用环境(PASE)运行。根据您的IBM i的不同版本,这一兼容特性需要安装以下组件:

  • V5R4: 5722SS1 33 Portable App Solutions Environment

  • V6R1: 5761SS1 33 Portable App Solutions Environment

  • V7R1: 5770SS1 33 Portable App Solutions Environment


IBM i支持以下语言编写的CGI程序:C++JavaILE CILE RPG 以及ILE COBOL


在编写CGI程序之前,您需要对环境变量的概念有所了解。环境变量是当服务器接收到URL编码信息后发送给CGI程序的一类信息。


编写基于ILE CCGI程序的6个步骤


接下来让我们看一个基于ILE C编写的CGI程序的示例。这个例子包含了打印当前日期以及环境变量的一些指令。


第一步:编写一个ILE C的源代码

新建一个文本文件,并输入以下内容,保存为samplec.txt

int main(int args, char* argv[]) {

printf("Content-type: text/html; \n");

printf("\n");

printf("<br>\n");

printf(" <!--#echo var=\"DATE_LOCAL\" -->");

printf("<br><br><br>\n");

printf(" <!--#printenv -->\n");

printf("<br>\n");

return;

}


第二步:创建目录结构

使用如下CL命令来创建需要使用的目录结构,这里我们将源文件放在/cgidemo/c目录下,而将生成后的CGI程序放在/qsys.lib/cgidemo.lib目录下。

mkdir dir('/qsys.lib/cgidemo.lib')

mkdir dir('/cgidemo')

mkdir dir('/cgidemo/c')

注意:您需要使用如下命令确保服务器的用户配置文件QTMHHTTP 以及CGI的用户配置文件QTMHHTP1对这些新目录有*RX(允许读取和使用)权限。

DSPAUT OBJ('/qsys.lib/cgidemo.lib')

DSPAUT OBJ('/cgidemo')

DSPAUT OBJ ('/cgidemo/c')


第三步:上传代码

使用FTP命令将第一步所创建的源代码上传到服务器的相应目录下。

put samplec.txt /cgidemo/c/samplec.c


第四步:创建PGM对象

使用如下CL命令编译生成名为SAMPLEC的程序(PGM)对象。

CRTCMOD MODULE(cgidemo/samplec) SRCSTMF('/cgidemo/c/samplec.c') OUTPUT(*print)

CRTPGM PGM(CGIDEMO/SAMPLEC) MODULE(CGIDEMO/SAMPLEC) BNDSRVPGM(QHTTPSVR/QZHBCGI)


第五步:创建一个Apache服务器

使用IBM Web Administration for i (http://<yourservername>:2001/HTTPAdmin)来创建一个新的Apache服务器。例如我们将其命名为CGIDEMO

  • 在左侧Server Properties按钮下的URL Mapping中的Aliases标签下,添加URL目录对CGI程序的映射。

图像 

  •   在Server Properties按钮下的Container Management中添加/QSYS.LIB/CGIDEMO.LIB的目录。
  • Tools按钮下点击Display Configuration File按钮,确认已经添加如下CGI相关指令:

Listen *:80

ScriptAlias /cgi-bin/ /QSYS.LIB/CGIDEMO.LIB/

<Directory /QSYS.LIB/CGIDEMO.LIB/>

AllowOverride None

order allow,deny

allow from all

SetHandler cgi-script

Options +ExecCGI

Options +Includes

SetOutputFilter INCLUDES

</Directory>


第六步:重启Apache服务器


重启Apache服务器,然后通过http://<yourservername>:<port>/cgi-bin/samplec.pgm来访问您编写的CGI程序。

如果一切正确的话,网页上将打印出如下信息:

Tuesday, 24-Nov-2009 12:47:24 Central Standard Time


HTTPS=OFF UNIQUE_ID=X33GEAkFr4YAAGbFZPEAAAAH QIBM_USE_DESCRIPTOR_STDIO=Y HTTP_HOST=lp05ut3.rchland.ibm.com:20000 HTTP_USER_AGENT=Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.04 (CK-IBM) (CK-IBM) Shiretoko/3.5.5 HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5 HTTP_ACCEPT_ENCODING=gzip,deflate HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7 HTTP_KEEP_ALIVE=300 HTTP_CONNECTION=keep-alive HTTP_COOKIE=CoreID6=89947119652712539186271&ci=90175093,90175080,90225345,90175119,90130510,90175106,90175067; IBMPOLLCOOKIE=""; sauidp=U636780271253923646326; w3ibmProfile=200011161518280656634250576|gAME|897|ECR|en; EPSPROFILE=13E0EC4D2AFB7B2AEABB45941E98CFE8; bprememberme=rwatkin@us.ibm.com; ithc=f61f212d9627ced87c8574f7a2fe7d268d80 HTTP_CACHE_CONTROL=max-age=0 PATH=/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin SERVER_SIGNATURE= SERVER_SOFTWARE=Apache SERVER_NAME=lp05ut3.rchland.ibm.com SERVER_ADDR=9.5.175.134 SERVER_PORT=20000 REMOTE_ADDR=9.49.184.2 DOCUMENT_ROOT=/www/rwatkins/htdocs SERVER_ADMIN=[no address given] SCRIPT_FILENAME=/QSYS.LIB/RWATKINS.LIB/printenv.pgm DOCUMENT_NAME=printenv.pgm REMOTE_PORT=58960 GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.1 REQUEST_METHOD=GET QUERY_STRING= REQUEST_URI=/cgi/printenv.pgm SCRIPT_NAME=/cgi/printenv.pgm DOCUMENT_URI=/cgi/printenv.pgm RULE_FILE=conf/httpd.conf CGI_MODE=EBCDIC CGI_OUTPUT_MODE=EBCDIC IBM_CCSID_VALUE=37 CGI_EBCDIC_CCSID=37 CGI_ASCII_CCSID=819 FSCP=37 NETCP=819 DATE_LOCAL=Tuesday, 24-Nov-2009 12:47:24 Central Standard Time DATE_GMT=Tuesday, 24-Nov-2009 18:47:24 GMT LAST_MODIFIED=Tuesday, 24-Nov-2009 12:47:20 Central Standard Time USER_NAME=RWATKINS SSI_ROOT=/QSYS.LIB/RWATKINS.LIB/ SSI_DIR=/ SSI_FILE=printenv.pgm


静态网页与动态网页的比较

现在您已经掌握了编写CGI程序并将其运行在Apache上以获取动态信息的技巧。一个普通的HTML文档只能从服务器获得静态的信息,也就是说用户请求的这个文档内容是固定的,不会改变。而通过CGI程序或其他实时运行的方法,将可以提供动态的定制化信息给用户。


FastCGI

作为CGI标准的扩展,开放标准FastCGI近来逐渐被各种Web服务器使用。该标准定义了Web服务器与外部独立进程中的FastCGI程序间交换数据的方式。在IBM i上,这些外部进程由一个名为FastCGIApache模块所管理,该模块将外部的PASE程序(FastCGI程序)以CGI的方式在原生的ILE环境下执行,从而获得更快的响应速度。更详细的FastCGI介绍请参照这里:

http://www-03.ibm.com/systems/resources/systems_i_software_http_docs_pase_config.pdf


PASEILE

IBM i的便携式解决方案应用环境PASE提供了一个集成运行环境,使得AIXLinux®等其他操作系统上的某些应用程序可以迁移至IBM i上运行。PASE还提供了一套由符合工业标准的Shell及各种工具组成的脚本执行环境。

集成语言环境ILEIBM i上为程序开发所提供的一套工具与系统支持的集合。包括ILE RPGILE COBOLILE CILE C++以及ILE CL几个子集。


使用RPG编写CGI程序

请参考这里:

http://www-03.ibm.com/systems/i/software/http/examples/samplerpg/rpg_demo.html

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11145986