什么是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;

}