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,当然可以取消这个限制,只要你对你的网络传输有着足够的信心就行。

总结一下:

  1. http协议并未规定get和post的长度限制
  2. get的最大长度限制是因为浏览器和web服务器限制了URL的长度
  3. 不同的浏览器和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字符时依然能正常编辑。
  • 服务器

3.3.3. get的参数通常方式URL上,post的参数通常方式body里

当然这个是常规做法,post的参数要放URL上,也是可以的,只是看服务端想怎么取了。

3.3.4. get比post更快

为什么get会比post更快?

  1. post请求包含更多的请求头,因为post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),但这个是微乎其微的。
  2. post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。这个就需要对TCP有一定了解,说的简单的,post会有一次服务器返回100 Continue响应。
  3. get可以将数据缓存起来,而post不会。
  4. post不能进行管线化传输,而get支持。所谓管线化传输,就是将多个HTTP要求整批提交的技术,而在传送过程中不需先等待服务端的响应。这个说起来有点复杂,不在这里展开了,有兴趣的同学可以去网上查询相关资料。

3.3.5. post比get更加安全

其实这里也会有一个误区,不少人在面试的时候会告诉我,因为get的请求会暴露在URL上,像登录这样的接口,账号密码会显示在浏览器地址栏上,所以不安全。 这样的回答其实是有些问题的,http协议中提到get是安全的方法(safe method)。其意思是说get方法不会改变服务器端数据,所以不会产生副作用。如果是该用post的地方用了get,又说get不安全,那get也太冤枉了,而且get的请求不一定都是放在浏览器的地址上的。

在我看来post和get更加安全注意还是以下几点:

  1. post数据默认不会被客户端缓存
  2. post能发送更多的数据类型和各种编码或者进行非对称加密,而get只能发送ASCII字符
  3. 就是前面提到的,post不能进行管道化传输以及post在真正接收数据之前会先将请求头发送给服务器进行确认

当然,以上只是我的个人看法,可能也不全对,我也会继续学习,后续会持续补充。