最近学习了一些简单的驱动,而正好可以在毕设上得到用武之地。于是在课余周末学习了一些关于CGI编程的那点事。
一、CGI概述
CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、C语言等。但是用C语言编写的CGI程序具有执行速度快、安全性高(因为C语言程序是编译执行且不可被修改)等特点。
二、CGI的工作原理
CGI 是一种通用的接口标准。CGI 程序就是符合这种接口标准的,运行在 Web 服务器上的程序。它的工作就是控制信息要求,产生并传回所需的文件。CGI由浏览器的输入触发这个程序。先看看浏览器浏览网页是怎样实现的。 作为一个用户首先在浏览器的地址栏中添加上要访问的主页地址并回车触发这个申请。浏览器将申请发送到服务器上。Web 服务器接收这些申请并根据.htm或.html 的后缀并认识到这是 HTML文件。Web 服务器从当前硬盘或内存中读取正确的 HTML 文件,然后将它送回浏览器。HTML 文件将被用户的浏览器解释并将结果显示在用户浏览器上。GI程序可以用来在 web 内加入动态的内容。通过接口,浏览器能够发送一个可执行应用程序的 HTTP 请求,而不仅仅只是静态的 HTML 文件。服务器运行指定的应用程序,这个应用程序读取与请求相关的信息,获得请求传过来的数值。例如使用者填写 HTML 表单提交了数据,浏览器将这些数据发送到 Web 服务器上。Web 服务器接收这些数据并根据客户机指定的CGI程序把这些数据递交给指定的CGI程序, 并使CGI在服务器上运行。 CGI程序运行结束, 生成HTML页面, Web服务器把CGI程序运行的结果送回用户浏览器。 HTML文件将会被用户的浏览器解释并将结果显示在用户浏览器上。 CGI的基本工作情况如下图所
示:
三、CGI通信
Web 服务器与CGI 程序之间通过四种途径进行通信: 环境变量、命令行、标准输入和标准输出。其中负责输入的有环境变量、命令行和标准输入。命令行只用于ISINDEX 查询,较少使用。 环境变量存放服务器向 CGI 程序传递的一些运行参数, 比如 REQUEST_METHOD 表示用户提出请求或提交数据的方法是 GET 还是 POST。方法(METHOD) 是 HTTP 中对命令的称呼。GET 方法通过环境变量 QUERY- STRING 传递用户提交的数据。经过编码的数据以问号打头追加在标识 CGI 脚本地址的 URL 后一起传给 Web 服务器。服务器将其存于 QUERY-STRING 中, CGI 程序可以通过 getenv( ) 函数来读取。编码数据除了表单数据, 还可以是直接调用 CGI 脚本时追加在 URL 地址后面的参数。POST 方法则通过标准输入( stdin) 传递提交数据。 编码了的表单数据独立地传送给 Web 服务器, CGI 程序从标准输入中获得, 可以用 getchar( ) , sscanf( ) , fread( ) 等函数。要注意的是数据的长度是通过读取环境变量 CONTENT_LENGTH 获得的, 而不是通过文件尾标识符来判断。
3.1标准输入
CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。POST方法是常用的方法,本文将以此方法为例,分析CGI程序设计的方法、过程和技巧。
3.2环境变量
操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过 环境变量QUERY-STRING向CGI程序传递Form中的数据。
3.3标准输出
CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者Html文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。
四、CGI的使用方法
一般而言,要使用 CGI 程序就必须在 Web 网页中迁入调用 CGI 程序的代码。通常的做法有三种,一是通过表单调用,二是通过超链接调用,三是通过SSI调用。这里着重阐述使用表单调用CGI程序的办法。那么如何将数据通过表单提交给 CGI程序了,下面是一个简单的表单:
<html> <title>简单的表单</title> <body> <form action="/cgi-bin/cgi_get" method="get"> <p align="center"> 参数 1:<input type="text" name="get_data1"> <br> 参数 2:<input type="text" name="get_data2"> <br> <p align="center"> <input type= "submit" name="submit" value="提交数据"> <input type="reset" name="reset" value="重新填写"> </form> </body> </html> |
网页中表单由字头<form>开始,</form>结束。其中 action=” /cgi-bin/cgi_get” 指明使用的 CGI 程序名为 cgi_get;method 属性指定提交数据的方法(POST 还是 GET),这里使用的是 GET 方法。在这个实例中我们提交了两个数据,一个是数据的名字是 get_data1,另一个数据的名字是 get_data2,它们的值由用户在网页中输入。这里首先了解一下 CGI 编码的规则。规则如下:不同域(变量值对)之间用“&”分开;变量与值之间用“=”连接;空格符用“+”代替;任何特殊字符用“%”接相应的十六进制 ASCII 码代替,最后形成的格式为:name1=value1&name2=value2%name3=value3 ...。假如用户在 get_data1 域中输入的是 12,在get_data2 域中输入的是 23。然后点击提交按钮这个内容将被编码。最后形成的编码如下:get_data1=12&get_data2=23&submit=%CC%E1%BD%CA%FD%BE%DD。