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)