例如在上例中用户填入了下述信息(其中\n表示回车换行):
name "J&K"
sex "male"
flavor "apple"
flavor "orange"
weight "middle"
opinion "I think it is necessary that\nman eat fruit everyday."
则Web浏览器发送数据时的字符序列为:
name=J%26K&sex=male&flavor=apple&flavor=orange&weight=middle&
opinion=I+think+it+is+necessary+that%0D%0Aman+eat+fruit+everyday.
用CGI程序处理得到的数据
当Web浏览器将Form数据经过编码后,就传送给了Web服务器,而Web服务器并非自己处理这些
数据,而是先依靠CGI程序来帮忙处理这些数据,然后Web服务器再把CGI程序产生的处理结果
返回给Web浏览器。CGI(Common Gateway Interface,通用网关接口)是信息服务器(如Web服
务器)与外部应用程序之间的一个接口标准。通常被Web服务器所取到的HTML文件总是事先编
辑好的,固定不变的信息,但若通过实时运行着的CGI程序Web服务器就有可能向Web浏览器
输出动态的信息。
CGI标准用最简单的话来说就是:CGI程序是通过标准输入(stdin)或环境变量来得到服务器的输
入信息,并通过标准输出(stdout)向服务器输出信息。
当Web服务器收到了由Web浏览器传来的Form数据时,就启动<FORM>标记中ACTION属性所指
明的CGI程序。如果METHOD属性值是GET,CGI程序就从环境变量QUERY_STRING中获取Form数
据;若METHOD属性值是POST,CGI程序就从标准输入(stdin)中获取Form数据。
CGI程序获取Form数据并经过处理后,还要向Web服务器返回一定的信息(如数据的处理结果等
)。为让Web服务器能正确理解所返回的是何种信息,CGI规定在输出的信息体前加上一个头部
信息,该头部信息由若干行ASCII文本构成,并用一个空行将头部信息与信息体隔开。例如要返
回HTML文档则头部信息为"Content-type: text/html"。
下面给出一个用C语言编写的CGI程序的基本框架:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char InputBuffer[4096];
int main(int argc, char *argv[]) {
int ContentLength; /*数据长度*/
int x;
int i;
char *p;
char *pRequestMethod; /* METHOD属性值 */
setvbuf(stdin,NULL,_IONBF,0); /*关闭stdin的缓冲*/
printf("Content-type: text/html\n"); /*从stdout中输出,告诉Web服务器返回的信息类型*/
printf("\n"); /*插入一个空行,结束头部信息*/
/* 从环境变量REQUEST_METHOD中得到METHOD属性值 */
pRequestMethod = getenv("REQUEST_METHOD");
if (pRequestMethod==NULL) {
return 0;
}
if (_stricmp(pRequestMethod,"POST")==0) {
p = getenv("CONTENT_LENGTH"); /*从环境变量CONTENT_LENGTH中得到数据长度*/
if (p!=NULL) {
ContentLength = atoi(p);
} else {
ContentLength = 0;
}
if (ContentLength>sizeof(InputBuffer)-1) {
ContentLength = sizeof(InputBuffer)-1;
}
i = 0;
while (i<ContentLength) { /*从stdin中得到Form数据*/
x = fgetc(stdin);
if (x==EOF) break;
InputBuffer[i++] = x;
}
InputBuffer[i] = '\0';
ContentLength = i;
DecodeAndProcessData(); /*具体译码和处理数据,该函数代码略*/
} else
if (_stricmp(pRequestMethod,"GET")==0) {
p = getenv("QUERY_STRING"); /*从环境变量QUERY_STRING中得到Form数据*/
if (p!=NULL) {
strncpy(InputBuffer,p,sizeof(InputBuffer));
DecodeAndProcessData(); /*具体译码和处理数据,该函数代码略*/
}
}
printf("<HEAD><TITLE>Submitted OK</TITLE></HEAD>\n"); /*从stdout中输出返回信息*/
printf("<BODY>The information you supplied has been accepted.</BODY>\n");
return 0;
}