HTTP Get和Post的区别 - 说点别的

224 阅读3分钟

常见区别:

  1. get限制长度,post比get长或不限制
  2. get安全性非常低,post安全性较高
  3. get使用url或cookie传参,post将数据放在body中

这些说法其实是在某些场景产生的:浏览器。单从http协议角度来看,get和post的区别在于传输方式不同,post只比get多了\r\n和body部分,跟协议本身没有太大关系

区别1

http协议并未对header和body做长度限制,实际是浏览器或服务器程序对url长度进行限制,据说IE对URL长度会限制在2048个字符内,道理很简单,太多数据会造成服务器的负担,况且我们无需传递那么多参数,浏览器暂且不说,我们来分析一下服务器程序不对数据进行长度限制会怎么样。

拿nginx和php举例吧,一个http请求到达nginx,nginx通过fastcgi告诉php你该干活了,phpcgi对http请求进行解析并设置环境变量(cgi程序通过设置环境变量来告诉子进程参数是什么),我们做一个夸张的假设:http post body为1Gb,php最大进程数是1000个,通过脚本不停的发送请求,每个php进程都包含1Gb的环境变量,这时候1000个进程的上下文切超级庞大,处理速度会超级慢,也会拖垮我们的服务器,所以http服务器程序基本都会做长度限制,如php、apache都可以在config里进行配置。

区别2

这个问题有些难讲,在web中post的安全性相对get要高一些,并不代表post就是真正的安全戳这里,而对于API来说get和post没什么区别,安全性在于API程序本身。

区别3

按照规范get请求只包含header,cookie是浏览器实现的功能,浏览器发送get请求时cookie会包含在header中。post可以同时用header和body。

GET结构

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html;
Upgrade-Insecure-Requests: 1
Cookie: __cfduid=xxxx

POST结构

POST / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html;
Upgrade-Insecure-Requests: 1

username=shangxiaopang&xxx=xxx

POST+GET

POST /?age=10 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html;
Upgrade-Insecure-Requests: 1

username=shangxiaopang&xxx=xxx

get也可以使用body传参数,这样并不符合规范,服务器程序也不能理解这种方式,但是可以自己动手写一下:

    发送请求程序
    sprintf(buf,"GETANDPOST /test?hehe=123 HTTP/1.1 \r\n");
    Rio_writen(client_fd,buf,strlen(buf));

    sprintf(buf,"Host: 127.0.0.1:8898 \r\n");
    Rio_writen(client_fd,buf,strlen(buf));

    sprintf(buf,"Content-Length: 17 \r\n");
    Rio_writen(client_fd,buf,strlen(buf));

    sprintf(buf,"Accept: */* \r\n");
    Rio_writen(client_fd,buf,strlen(buf));

    sprintf(buf,"\r\n");
    Rio_writen(client_fd,buf,strlen(buf));

    sprintf(buf,"name=shang&age=25");
    Rio_writen(client_fd,buf,strlen(buf));
    close(client_fd);

下面是服务器程序解析后的数据,代码就省略了

---Header---

GETANDPOST /test?hehe=123 HTTP/1.1
Host: 127.0.0.1:8898 
Content-Length: 17 
Accept: */* 

---Header---
request_method : GETANDPOST
post_params : name=shang&age=25