简介
CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与 Web 服务器交互的一个标准接口。服务器端与客户端进行交互的常见方式多,CGI 技术就是其中之一。根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。CGI规范定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。
实验环境
已经移植好嵌入式Web服务器Boa的开发板,Boa是支持CGI的。
关于BOA服务器的移植 请移步 BOA移植
下载CGIC库源码
git下载地址:CGIC
可以通过git clone下载或者以下方式下载:
下载完ZIP压缩包后放到虚拟机中去。
用以下命令解压:
unzip cgic-master.zip
配置CGIC编译
修改Makefile
vim Makefile
将 CC AR RANLIB都改成自己交叉编译工具对应的工具
我的交叉编译工具链是arm-linux-gcc 所以我的修改如下:
将Makefile第22 25改为如下:
执行make命令编译
make -j8
编译成功后会生成 capture 和 cgictest.cgi
将 capture 和 cgictest.cgi 放置到开发板中的存放cgi的目录中去 比如我的是/var/www/cgi-bin/
cp capture cgictest.cgi NFS/rootfs/var/www/cgi-bin/
测试CGI接口
capture
capture是一个调试程序 你可以将你的网页表单提交地址指向它,之后它会捕捉你表单的内容存储到你指定的目录中去,在使用前要修改下源码
capture代码如下:
修改上面的/CHANGE/THIS/PATH/capcgi.dat 为你想要将捕捉的内容保存到哪个个文件。
将表单提交地址指向capture后 效果如下:
此时在你指定的保存目录中已经生成了保存的表单信息!
cgictest.cgi
cgictest.cgi是一个CGI接口的测试程序,我们可以通过网页链接直接访问它,比如我可以访问我的开发板:http://192.168.232.201/cgi-bin/cgictest.cgi
然后页面就会显示该CGI接口提供的HTML页面。
效果如下:
我们可以通过CGIC提供的cgictest.cgi来了解下CGIC库的用法。
编写一个简单的获取表单的CGI接口
1.首先我们需要准备一份简单的HTML表单页面,这里就以一个简单的登录表单为例 HTML代码如下:
<html>
<head></head>
<form action="cgi-bin/login.cgi">
User:<br>
<input type="text" name="user" value="yaomianfa">
<br>
passwd:<br>
<input type="text" name="passwd" value="st123456">
<br><br>
<input type="submit" value="Submit">
</form>
</html>
该html效果如下:
我们的目的就是通过CGI接口获取到user字段的值和passwd字段的值
将该HTML代码保存为login.html
然后放置到开发板的www目录中:
cp login.html NFS/roots/var/www/
2.编写CGI接口
我们的HTML表单中指定了提交地址:
<form action="cgi-bin/login.cgi">
所以我们需要编写的cgi接口名字为login.cgi
login.c接口代码如下:
#include "cgic.h"
int cgiMain() { //cgi程序以cgiMain作为入口点
char userbuf[100]; //存储用户名的缓存区
char pwdbuf[100]; //存储密码的缓存区
cgiFormString("user", userbuf, 100); //从表单中的user字段获取值存入到userbuf
cgiFormString("passwd", pwdbuf,100); //从表单中的passwd字段获取值存入到pwdbuf
cgiHeaderContentType("text/html"); //设定输出的内容格式 这里我们要输出HTML
fprintf(cgiOut,"<title>Test by yaomianfa</title>"); //输出HTML
fprintf(cgiOut,"<h1>test!!</h1>");
fprintf(cgiOut,"username: %s",userbuf);
fprintf(cgiOut,"<br>"); //HTML的换行标签
fprintf(cgiOut,"passwd: %s",pwdbuf);
return 0;
}
编译login.c 生成login.cgi
这里我们偷个懒 将login.c复制到我们下载的cgic库目录中去
cp login.c cgic-master/
修改cgic-master/Makefile
加入一个新的编译目标:
执行下列命令编译:
make login.cgi
生成login.cgi
将login.cgi放置到开发板中的cgi目录中去
cp login.cgi NFS/rootfs/var/www/cgi-bin/
测试login.cgi
访问开发板的登录页面:
http://192.168.232.201/login.html
点击Submit提交到我们的CGI接口中去
CGI接口处理信息后输出HTML:
至此CGI接口编写成功。
CGIC接口API
关于CGIC提供的所有API,可以源码目录下面的这两个文件中可以查看:README.md 和 cgic.html
这里提一下CGIC获取表单的接口API的命名
所有获取表单的API的命名如下:
cgiFormXXXXX
cgiFormXXXXX的第一个参数都是要获取的字段名
从表单中获取字符串用的是 cgiFormString
获取小数用的是 cgiFormDouble
检测复选框有没有被勾选:cgiFormCheckboxSingle
cgiFormRadio()可以确定一组具有相同名称的单选框中的哪一个被选中了
cgiFormInteger 从表单中获取整数 等等
还有一些函数可以操作cookie 设置HTML头部的一些信息
具体看上面两个文件中关于函数的介绍就知道了。