最近面试被问到get和post的区别,由于以为这个问题太基础了,勉强的回答了一下(面试没过),回去的路上忽然以为压根没弄明白具体的区别是什么。下面开始分析有不对的地方欢迎指正!php
常见区别:html
这些说法实际上是在某些场景产生的:浏览器,单从http协议角度来看,get和post的区别在于传输方式不一样,post只比get多了\r\n和body部分,跟协议自己没有太大关系。nginx
http协议并未对header和body作长度限制,实际是浏览器或服务器程序对url长度进行限制,听说IE对URL长度会限制在2048个字符内,道理很简单,太多数据会形成服务器的负担,何况咱们无需传递那么多参数,浏览器暂且不说,咱们来分析一下服务器程序不对数据进行长度限制会怎么样。web
拿nginx和php举例吧,一个http请求到达nginx,nginx经过fastcgi告诉php你该干活了,phpcgi对http请求进行解析并设置环境变量(cgi程序经过设置环境变量来告诉子进程参数是什么),咱们作一个夸张的假设:http post body为1Gb,php最大进程数是1000个,经过脚本不停的发送请求,每一个php进程都包含1Gb的环境变量,这时候1000个进程的上下文切超级庞大,处理速度会超级慢,也会拖垮咱们的服务器,因此http服务器程序基本都会作长度限制,如php、apache均可以在config里进行配置。面试
这个问题有些难讲,在web中post的安全性相对get要高一些,并不表明post就是真正的安全戳这里,而对于API来讲get和post没什么区别,安全性在于API程序自己。apache
按照规范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