《cgic编程 — 实例 》
Posted zhuangquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《cgic编程 — 实例 》相关的知识,希望对你有一定的参考价值。
1.向浏览器打印信息
1.c #include <stdio.h> #include "cgic.h" #include <string.h> #include <stdlib.h> int cgiMain() { cgiHeaderContentType("text/html"); fprintf(cgiOut, "<HTML><HEAD>/n"); fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD>/n"); fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY>/n"); fprintf(cgiOut, "</HTML>/n"); return 0; }
gcc 1.c -o 1.cgi -lcgic。
将1.cgi放在/var/www/cgi-bin/中
2.获得Get请求字符串
Get请求就是我们在浏览器地址栏输入URL时发送请求的方式,或者我们在HTML中定义一个表单(form)时,把action属性设为“Get”时的工作方式;
Get请求字符串就是跟在URL后面以问号“?”开始的字符串,但不包括问号。比如这样的一个请求:http://127.0.0.1/cgi-bin/out.cgi?ThisIsTheGetString
在上面这个URL中,“ThisIsTheGetString”就是Get请求字符串。
在进入我们自己编写的cgi代码之前,CGIC库已经事先把这个字符串取到了,我们可以在程序中直接获得,要做的仅仅是在你编写的cgiMain方法前面加入以下声明:
extern char *cgiQueryString;
实例:
#include <stdio.h> #include "cgic.h" #include <string.h> #include <stdlib.h> extern char *cgiQueryString; int cgiMain() { cgiHeaderContentType("text/html"); fprintf(cgiOut, "<HTML><HEAD>/n"); fprintf(cgiOut, "<TITLE>My CGIC</TITLE></HEAD>/n"); fprintf(cgiOut, "<BODY>"); fprintf(cgiOut, "<H1>%s</H1>",cgiQueryString); fprintf(cgiOut, "</BODY>/n"); fprintf(cgiOut, "</HTML>/n"); return 0; }
编译以上程序为2.cgi。
在浏览器中输入http://127.0.0.1/cgi-bin/2.cgi?ThisIsTheGetString。
3.通过html中表单访问对应的cgi
test.html
<html> <head> <title>Test</title> </head> <body> <form action="cgi-bin/out.cgi" method="get"> <input type="text" name="theText"> <input type="submit" value="Continue →"> </form> </body> </html>
将test.html放在/var/www/目录下。
点击continue
其中“+”就是空格,因为url会把空格传输的以用"+"替换。
4.反转义
浏览器在发送Get请求时,会把请求字符串进行转义操作(英文术语为: escape); 比如,我们在地址栏输入(注意最后”it’s me”中的空格):
http://localhost/~Jack/cgi-bin/out.cgi?it‘s me
浏览器会把它转义为:
http://localhost/~Jack/cgi-bin/out.cgi?it‘s%20me
在上一篇最后给出的例子中,如果在文本框内输入:it‘s me
浏览器最终发送的请求为:http://localhost/cgi-bin/2.cgi?theText=it%27s+me
但是最终显示为:theText=it%27s+me
通过CGIC,我们可以把这些被转义后的字符还原为我们本来的输入,这个过程就叫“反转义” (Unescape)。
整个过程分三个步骤:
1)打开cgic.c,找到这一行语句
static cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len);
注意,我们要找的只是这个函数声明,不是函数定义。
2)在这个函数声明语句的上方,你会看到一个结构体定义
typedef enum { cgiUnescapeSuccess, cgiUnescapeMemory } cgiUnescapeResultType;
把这几行语句复制到cgic.h文件中,并在这里把它注释掉。
同时还要删除在第一步中找到的函数声明语句中的“static”关键字。
3)我们现在就可以使用反转义函数cgiUnescapeChars了
在你自己的代码(按照惯例,还是test.c)中,加入以下声明语句即可
extern cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len);
实例:
#include <stdio.h> #include "cgic.h" #include <string.h> #include <stdlib.h> extern char *cgiQueryString; extern cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len); int cgiMain() { char * buffer; cgiHeaderContentType("text/html"); fprintf(cgiOut, "<HTML><HEAD>/n"); fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>/n"); fprintf(cgiOut, "<BODY>"); cgiUnescapeChars(&buffer, cgiQueryString, strlen(cgiQueryString)); fprintf(cgiOut, "<H1>%s</H1>",buffer); fprintf(cgiOut, "</BODY>/n"); fprintf(cgiOut, "</HTML>/n"); free(buffer); return 0; }
以上是关于《cgic编程 — 实例 》的主要内容,如果未能解决你的问题,请参考以下文章