GET
与POST
这个面试题算是比较经典的面试题了,本来我不是特别感兴趣的,但是有群友问到了,我于是就回答了一下。
但是他说我回答的不够细致,面试时候会有隐患,于是我立刻查漏补缺,学习一个。
正文
本篇文章算是转载,并非原创,仅供记录使用。
GET
请求不安全,POST
请求更安全
GET
请求参数会直接挂载在URL上,POST
请求携带的参数在URL上看不见。
POST
请求记录不会被保存在浏览器历史或web服务器日志中,但是GET
请求会。
当然,以上是相对的。这不表示POST
请求就绝对安全,其实。
从数据传输的角度来说,POST
和GET
都不是很安全,因为http协议本身是明文传输。对内行人来说,抓包解析GET
和POST
都是一样的。
GET
请求可以缓存,POST
请求不能缓存
GET
请求一般用于数据和静态资源的获取。
有些GET
请求不用和数据库交互,比如一些静态资源和固定的字典表,所以可以使用缓存,如下图两个例子所示。
POST
请求则更多用于数据的新增和修改,新增数据无法具备固定内容,所以很多浏览器都不支持缓存POST
请求。
GET
请求有长度限制,POST
请求没有长度限制
GET
请求本身是没有长度限制的,但是URL有,不同的浏览器对于GET
的长度限制也不一样。
1 | IE:对IE浏览器URL的最大长度为2083个字符。 |
所以,在需要兼容IE的情况下,URL请求的长度最长只能有2083个字符。
GET
只能传输字符串,POST
可以传输多种类型数据
因为GET
请求是挂载在URL上的,所以传输的数据类型只能是字符串,但是POST
请求可以传输除字符串以外的数据,比如:视频,声音,图片,文档等。
GET
请求入参在URL上,POST
请求入参在Request body上
这条就不放图了,反正平日大家开发过程中都明白,POST
提交的数据一般都放在request body
中
GET
只会发送一个数据包,POST
有可能产生两个数据包
对于GET
方式的请求,浏览器会把http header
和data
一并发送出去,服务器响应200(返回数据)
对于POST
,浏览器先发送header
,服务器响应100 continue
,浏览器再发送data
,服务器响应200 ok,如果第一个请求(header)失败,则data不进行发送。
但是,这并不代表我们要将POST
请求全部替换为GET
,这种做法显然是错误的。
GET
与POST
都有自己的语义,不能随便混用。- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
- 并不是所有浏览器都会在
POST
中发送两次包,Firefox
就只发送一次
刷新和回退的时候,GET
请求无害,POST
数据会被重新提交
以前我一直没搞明白这一点区别的含义,怎么GET
就无害了,POST
就又会重新提交了?
后来我明白了,这点区别指向的是那些页面加载时候就默认执行的请求。
比如静态资源获取,刷新了就得重新加载。
如果是GET
,GET
主要用重新获取数据,因为是获取,请求不会对数据产生什么危害,何况有时候还直接返回的缓存,所以无害。
再说POST
,POST
主要用于数据的修改/新增,针对默认执行的情况下,POST
请求的每次执行都有可能改变数据库中的某一个值,比如重复提交表单。
刷新一下就会提示你是否要重复提交表单,这点在一些政务网站中比较常见。
所以这里说POST
数据会被重新提交,涉及到增删改类的数据操作,确实显得有害。
总结
面试回答时候,我们没必要回答的那么繁琐,只要大概回答出以下几点即可。
POST
请求相对安全,GET
请求相对不安全GET
请求可以缓存,POST
请求不能缓存GET
请求有长度限制,POST
请求没有长度限制GET
只能传输字符串,POST
可以传输多种类型数据GET
请求入参在URL上,POST
请求入参在Request body上POST
有可能产生两个数据包,GET
只会发送一个数据包- 刷新和回退的时候
GET
请求无害,POST
数据会被重新提交
结语
这个知识点确实是我之前欠缺了解了,不知道如今我的这份回答是否够详细,希望能入的了群友的法眼。
哎,面试要准备的题好多啊。
参考
GET请求和POST请求的区别,你还记得吗? - 掘金 (juejin.cn)
面试突击71:GET 和 POST 有什么区别? - 掘金 (juejin.cn)