GI程序,因此POST方法可较方便的传递数据给CGI程序。
SCRIPT—NAME:该CGI程序的名称
QUERY-STRING:当使用POST方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序
CONTENT-TYPE:传递给CGI程序数据的MIME类型,通常为"application/x-www-form-url-encoded",它是html form中以POST方法传递数据给CGI程序的数据编码类型,成为URL编码类型。
CONTENT-LENGTH: 传递给CGI程序的数据字符数(字节数)
三,Form中输入的分析和解码
1. 分析名字/值对
当用户提交一个html form时,Web浏览器首先对form中的数据以名字/值对的形式进行编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。其格式如下:
name1=value1&name2=value2&name3=value3&name4=value4...
其中名字是form中定义的input、select或textarea等tag的名字,值是用户输入或者选择的值。这种格式即为URL编码,程序中需要对其进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对,这可以通过在输入流中查找下面的两个字符来完成。
每当找到字符=,标志着一个form变量名字的结束;每当找到字符&,标志着一个form变量值的结束。清注意输入数据的最后一个变量值不以&结束。
一旦名字/值对分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符,这些特殊字符是:
+ : 将+转换成空格符
%xx : 用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。
对form变量名和变量值都要进行这种转换。下面是一个对form数据进行分析并将结果回送给Web服务器的CGI程序。
C代码
#include
#include
#include
int htoi(char *);
main()
{
int i, n;
char c;
printf("Contenttype:text/plain\n\n");
n = 0;
if(getenv("CONTENT-LENGTH"))
n = atoi("CONTENT-LENGTH");
for(i = 0;i < n;i++)
{
int is-eq = 0;
c = getchar();
switch(c)
{
case '&' :
c = '\n';
break;
case '+' :
c = ' ';
break;
case '%' :
{
char s[3];
s[0] = getchar();
s[1] = getchar();
s[2] = 0;
c = htoi(s);
i += 2;
}
break;
case '=' :
c = ':';
is-eq = 1;
break;
};
putchar(c);
if(is-eq)
putchar(' ');
}
putchar('\n');
fflush(stdout);
}
/** Convert hex string to int **/
int htoi(char *s)
{
char *digits = "0123456789ABCDEF";
if(islower(s[0])) s[0] = toupper(s[0]);
if(islower(s[1])) s[1] = toupper(s[1]);
return 16 * (strchar(digits,s[0]) - strchar(digits, '0')) + (strchar(digits,s[1] - strchar(digits, '0')));
}
上面的程序首先输出一个MIME头信息给Web服务器,检查输入中的字符数,并循环检查每个字符。
三,产生HTML输出
CGI的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。可以使用MIME头信息为"Contenttype:text/html\n\n"来输出html源代码给Web服务器,下面是一个简单的例子:
C代码
#include
#include
main()
{
printf("Contenttype:text/html\n\n");
printf("\n");
printf("An HTML Page From a CGI\n″");
printf(" This is an HTML page generated from with i n a CGI program.. .
\n");
printf("
\n");
printf(" Go back to out put.html page <
/b>\n");
printf("\n");
printf("\n");
fflush(stdout);
}
作者“telyy123”