什么是CGI?
CGI是通用网关接口(Common Gateway Interface);是HTTP服务器与其它程序进行“交谈”的工具,通过CGI接口就能在服务器端运行其他的程序。CGI是任何具备标准输入、输出、环境变量的语言编写并生成的可执行文件。
CGI处理步骤
通过浏览器将用户请求送到服务器服务器接收用户请求并交给CGI程序处理CGI程序把处理结果传送给服务器服务器把结果送回到浏览器
CGI编程
CGI程序通过标准输入(stdin)、标准输出(stdout)实现与web服务器间信息的传递
环境变量为Web服务器和CGI接口之间约定的,用来向CGI程序传递一些重要的参数
CGI传送给Web服务器的信息可以用各种格式,通常是以HTML文本或者XML文本的形式
(1)传输HTML,文本第一行输出的内容必须是"content-type:text/html\n\n"
(2)传输XML,文本第一行输出的内容必须是”content-type:text/xml\n\n”
(3)还有其他的一些格式:JIF(image/gif)、JPEG(image/jpeg)、AVI(video/avi)
两个重要的CGI环境变量:
QUERY_STRING:在浏览器端以GET的方法输入的数据,数据的内容就是url问号后的内容
//可以直接读取到数据
char *data = getenv("QUERY_STRING");//data-->"10+20"
CONTENT_LENGTH:在浏览器端以POST方法输入的数据的字节数,数据的内容通过标准输入获取
//1、首先的到数据的长度
char *len = getenv("CONTENT_LENGTH");
//2、根据长度 从标准输入设备 获取内容
char data[128]="";
fgets(data,atoi(len)+1, stdin);//"10+20"
案例:cgi实现计算器(GET异步方式实现)
demo1.html
data1:
data2:
result:
js01.js
function getXMLHttpRequest()
{
var xmlhttp = null;
if (window.XMLHttpRequest)//自动检测当前浏览器的版本,如果是IE5.0以上的高版本的浏览器
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();//创建请求对象
}
else如果浏览器是底版本的
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建请求对象
}
return xmlhttp;//返回请求对象
}
function my_calc(arg)
{
var data1 = document.getElementById("data1").value;
var data2 = document.getElementById("data2").value;
if(data1.length == 0 || data2.length == 0)
{
alert("data1 或 data2不能为空");
return;
}
if(isNaN(data1) || isNaN(data2))
{
alert("请输入有效数字");
document.getElementById("data1").value = "";
document.getElementById("data2").value = "";
return;
}
var url = "";
url += "cgi-bin/cgi_calc?"
url += data1;
if(arg == 0)
{
url += "+";
}
else if(arg == 1)
{
url += "-";
}
url += data2;
//获取xmlhttprequest对象
var xmlhttp = getXMLHttpRequest();
//设置服务器异步响应的回调函数
xmlhttp.onreadystatechange = function(){
document.getElementById("label").innerHTML = xmlhttp.responseText;
}
// 创建服务器请求
xmlhttp.open("get", url, true);
// 发送服务器请求
xmlhttp.send();
}
cgi_calc.c
#include
#include
int main()
{
//传输HTML 文本第一行输出的内容必须是"content-type:text/html\n\n"
printf("content-type:text/html\n\n");
//获取服务器数据 GET方式 QUERY_STRING
char *data = getenv("QUERY_STRING");//data = "10+20"
int data1=0,data2=0;
char ch = 0;
sscanf(data, "%d%c%d", &data1, &ch, &data2);
if(ch == '+')
{
printf("%d\n", data1+data2);
}
else if(ch == '-')
{
printf("%d\n", data1-data2);
}
return 0;
}