http的GET和POST

本文主要内容
1、    GET和POST方法介绍
2、    源代码分析
3、    结果分析
参考及引用:
  http://www.cnblogs.com/zhijianliutang/archive/2012/09/23/2698860.html
  http://www.cnblogs.com/liuzhang/p/3929198.html
  http://www.cnblogs.com/Daniel-G/p/3995854.html
-----------------------------------------------------------------------------------------------------------------
1、GET和POST方法介绍
html发送表单给服务器常用方法有两种:GET和POST。
<1> GET方法发送给服务器的数据保存在服务器的QUERY_STRING环境变量中。读取这个环境变量的值,就可以获得数据。发送的数据就直接接在html信息头的后面,作为数据的一部分,这个后面会说明。
<2> POST方法的数据是放在发送过去的信息体中。其数据的长度保存在服务器的CONTENT_LENGTH环境变量中,数据被重定向到了标准输入,只要从标准输入读取CONTENT_LENGTH长度的数据即可。读取之后提取其中有用的数据。

2、源代码
<1> html
如下,是我写的网页,action属性指定接收并处理这个表单的函数,method指定表单发送的方法。文件名:button.html
<html>
<form action="http://192.168.1.112/cgi-bin/button.cgi" method="get">
<input type="submit" name="button1" value="up"/>
<input type="submit" name="button2" value="down"/>
<input type="submit" name="button3" value="left"/>
<input type="submit" name="button4" value="right"/>
</form>
</html>
<2> 使用c语言写的cgi,文件名button.c。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getcgidata(FILE *fp, char *req_method)
{
    char *input;
    int length;

/* GET */
    if (strcmp(req_method, "GET") == 0) {
        /* get方法的数据放在QUERY_STRING中 */
        input = getenv("QUERY_STRING");    
        /* 将结果打印到浏览器中 */
        printf("<p>input:%s</p>", input);
        return input;
    /* POST */
    } else if (strcmp(req_method, "POST") == 0) {
        length = atoi(getenv("CONTENT_LENGTH"));    
        /* CONTENT_LENGTH保存POST方法数据的长度 */
        printf("length:%d\n", length);
        input = malloc(sizeof(char)*length + 1);
        /* 从标准输入读取数据 */
        int i = 0;
        while (i < length) {
            input[i] = getc(fp);
            i++;
        }
        input[i] = ‘\0‘;
        printf("<p>input : %s</p>", input);
        return input;
    }
    return NULL;
}

int main(int argc, char *argv[])
{
    char *input;
    char *req_method;

/* 确定发给服务器数据的类型,需要有一个空行,
     * 将文本内容空开*/
    printf("Content-type:text/html\n\n");    
    /* 从环境变量获取发送过来数据的方法 */
    req_method = getenv("REQUEST_METHOD");
    printf("<p>req_method:%s</p>", req_method);

input = getcgidata(stdin, req_method);

free(input);

return 0;
}
我是在虚拟机中安装ubuntu,并配置apache服务器,在终端执行:
gcc button.c –o button.cgi
移动到apache服务器的cgi目录。
sudo mv button.cgi /var/www/cgi-bin/
注意生成的cgi文件的权限。
cp button.html /var/www/
将button.html文件放在/var/www/目录中。

3、结果分析

在windows上的浏览器搜索栏中输入“服务器的ip地址/buuton.html”,访问虚拟机中ubuntu上运行的apache服务器。例如我的服务器地址是192.168.1.112,在搜索栏中输入“192.168.1.112/button.html”。当然也可以直接在本地打开button.html文件,就不需要那么麻烦。如下图所示:

点击其中的某个按键,例如down。在搜索栏中可以看到,get的数据是在发送的信息头中,并且是在“?”之后。

使用Colasoft Capsa 7 Enterprise进行抓包,读取HTTP部分的信息。如下图所示,这就是发送给服务器的信息的信息头。

而将html中的method改正post之后,结果又会怎样呢?

点击down,结果如下:

可以看出,POST的数据是放在发送给服务器的数据信息体的内部的。抓包也可以看出。

时间: 2024-10-17 21:30:05