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之于Perl等这些脚本语言,就如ECMAScript于javascript,前者同样是一套标准(接口)
cgi原理
CGI接口标准包括标准输入、环境变量、标准输出三部分:
stdlib.h库中定义的用于Cgi编程的环境变量列表:
无论是用Perl还是C语言写cgi程序,实际上都是调用标准库内置的一系列api。
案例
<!-- 客户端 -->
<!-- cgi_test.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<title>cgi_test</title>
</head>
<body>
<center>
<!-- 注意表单的 action值 -->
<form id="form" name="form" method="get" action="http://localhost:12308/cgi-bin/test/cgi_test.cgi">
<p>姓名:<input type="text" name="user" /></p>
<p><input type="submit" name="submit" value="提交" placeholder="请输入: " style=" 120px;position: relative;left: 20px;" /></p>
</form>
</center>
</body>
</html>
// 服务器端
/* cgi_test.cgi */
/* 将以下C代码编译成.cgi二进制文件后即可使用 */
// 以下代码可以得到上述表单通过get方法传给服务器的信息
/*
get方式提交,意思就是把提交的内容放在地址后面,用?隔开
post提交就是把数据放在数据包里发送给目标地址
*/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "iostream"
#include "string"
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { // Html头信息,它告诉Web服务器随后的html代码输出是以纯ASCII文本的形式
int i, n = 0;
string Str = "";
printf("Content-type:text/html
");
printf("<h1>get and post< !/h1>
");
if(getenv("CONTENT-LENGTH")) { // 检查环境变量CONTENT-LENGTH是否为空(Web服务器并不以文件结束符来终止它的输出,所以如果不检查环境变量CONTENT-LENGTH, CGI程序就无法知道什么时候输入结束了)
n=atoi(getenv("CONTENT-LENGTH")); // 使用atoi()将CONTENT-LENGTH转换为整数,内容的长度
Str = getenv("QUERY_STRING");
}
printf("%s
", Str); // 打印get方法获取的信息
fflush(stdout);
return 0;
}
// .cgi文件一般放在Apache服务器的cgi-bin目录即可使用