3.3. get和post的区别
不少同学在面试中会被问到http请求里,get和post的区别,这个问题主要目的还是面试官希望了解大家对HTTP请求了解程度,对于这个问题,网上会有着很多不同的答案,甚至有些答案还是错误的,容易让大家产生一些误区从而无法自拔,下面我先来整理一下
3.3.1. post用于修改,get是用于资源的获取、读取数据
其实这个是最根本的区别,也是http定义get和post的基本,但是并不是绝对的,不少公司也会用post获取数据,get提交数据,都是可行的。
3.3.2. post发送的数据更大,get有长度限制
其实这里有个误区,会觉得get的URL会有长度限制,有的人会告诉我是1024字节,其实是不对的。
http协议从未规定get/post的请求长度限制是多少,限制URL长度的通常是浏览器或者web服务器,而且每个浏览器的限制长度都不相同。post请求也不是完全的没有限制,也是需要依赖于web服务器或者依赖的服务,比如Tomcat默认限制大小就是2M,当然可以取消这个限制,只要你对你的网络传输有着足够的信心就行。
总结一下:
http协议并未规定get和post的长度限制
get的最大长度限制是因为浏览器和web服务器限制了URL的长度
不同的浏览器和web服务器,限制的最大长度不一样
3.3.2.1. 各个浏览器和web服务器的最大长度总结
浏览器
IE:IE浏览器(Microsoft Internet Explorer) 对url长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用)。
firefox:firefox(火狐浏览器)的url长度限制为65536字符,但实际上有效的URL最大长度不少于100000个字符。
chrome:chrome(谷歌)的url长度限制超过8182个字符返回本文开头时列出的错误。
Safari:Safari的url长度限制至少为80000字符。
Opera:Opera 浏览器的url长度限制为190 000 字符。Opera9 地址栏中输入190000字符时依然能正常编辑。
服务器
Apache:Apache能接受url长度限制为8192字符
IIS:Microsoft Internet Information Server(IIS)能接受url长度限制为16384个字符。这个是可以通过修改的(IIS7)configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryStringsetting.
3.3.3. get的参数通常方式URL上,post的参数通常方式body里
当然这个是常规做法,post的参数要放URL上,也是可以的,只是看服务端想怎么取了。
3.3.4. get比post更快
为什么get会比post更快?
post请求包含更多的请求头,因为post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),但这个是微乎其微的。
post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。这个就需要对TCP有一定了解,说的简单的,post会有一次服务器返回100 Continue响应。
get可以将数据缓存起来,而post不会。
post不能进行管线化传输,而get支持。所谓管线化传输,就是将多个HTTP要求整批提交的技术,而在传送过程中不需先等待服务端的响应。这个说起来有点复杂,不在这里展开了,有兴趣的同学可以去网上查询相关资料。
3.3.5. post比get更加安全
其实这里也会有一个误区,不少人在面试的时候会告诉我,因为get的请求会暴露在URL上,像登录这样的接口,账号密码会显示在浏览器地址栏上,所以不安全。 这样的回答其实是有些问题的,http协议中提到get是安全的方法(safe method)。其意思是说get方法不会改变服务器端数据,所以不会产生副作用。如果是该用post的地方用了get,又说get不安全,那get也太冤枉了,而且get的请求不一定都是放在浏览器的地址上的。
在我看来post和get更加安全注意还是以下几点:
post数据默认不会被客户端缓存
post能发送更多的数据类型和各种编码或者进行非对称加密,而get只能发送ASCII字符
就是前面提到的,post不能进行管道化传输以及post在真正接收数据之前会先将请求头发送给服务器进行确认
当然,以上只是我的个人看法,可能也不全对,我也会继续学习,后续会持续补充。