10分钟了解GET与POST的区别
2024-07-06 05:05:44

GETPOST这个面试题算是比较经典的面试题了,本来我不是特别感兴趣的,但是有群友问到了,我于是就回答了一下。

但是他说我回答的不够细致,面试时候会有隐患,于是我立刻查漏补缺,学习一个。

正文

本篇文章算是转载,并非原创,仅供记录使用。

GET请求不安全,POST请求更安全

GET请求参数会直接挂载在URL上,POST请求携带的参数在URL上看不见。

POST请求记录不会被保存在浏览器历史或web服务器日志中,但是GET请求会。

当然,以上是相对的。这不表示POST请求就绝对安全,其实。

从数据传输的角度来说,POSTGET都不是很安全,因为http协议本身是明文传输。对内行人来说,抓包解析GETPOST都是一样的。

GET请求可以缓存,POST请求不能缓存

GET请求一般用于数据和静态资源的获取。

有些GET请求不用和数据库交互,比如一些静态资源和固定的字典表,所以可以使用缓存,如下图两个例子所示。

image-20240608222352307

image-20240608222428730

POST请求则更多用于数据的新增和修改,新增数据无法具备固定内容,所以很多浏览器都不支持缓存POST请求。

GET请求有长度限制,POST请求没有长度限制

GET请求本身是没有长度限制的,但是URL有,不同的浏览器对于GET的长度限制也不一样。

1
2
3
4
5
IE:对IE浏览器URL的最大长度为2083个字符。
Firefox:对Firefox浏览器URL的最大长度为65536个字符。
Safari: 对Safari浏览器URL的最大长度为80000个字符。
Opera: 对Opera浏览器URL的最大长度为190000个字符。
Google(chrome):对Google浏览器URL的最大长度为8182个字符。

所以,在需要兼容IE的情况下,URL请求的长度最长只能有2083个字符。

GET只能传输字符串,POST可以传输多种类型数据

因为GET请求是挂载在URL上的,所以传输的数据类型只能是字符串,但是POST请求可以传输除字符串以外的数据,比如:视频,声音,图片,文档等。

GET请求入参在URL上,POST请求入参在Request body上

这条就不放图了,反正平日大家开发过程中都明白,POST提交的数据一般都放在request body

GET只会发送一个数据包,POST有可能产生两个数据包

对于GET方式的请求,浏览器会把http headerdata一并发送出去,服务器响应200(返回数据)

对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok,如果第一个请求(header)失败,则data不进行发送。

但是,这并不代表我们要将POST请求全部替换为GET,这种做法显然是错误的。

  1. GETPOST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次

刷新和回退的时候,GET请求无害,POST数据会被重新提交

以前我一直没搞明白这一点区别的含义,怎么GET就无害了,POST就又会重新提交了?

后来我明白了,这点区别指向的是那些页面加载时候就默认执行的请求。

比如静态资源获取,刷新了就得重新加载。

如果是GETGET主要用重新获取数据,因为是获取,请求不会对数据产生什么危害,何况有时候还直接返回的缓存,所以无害。

再说POSTPOST主要用于数据的修改/新增,针对默认执行的情况下,POST请求的每次执行都有可能改变数据库中的某一个值,比如重复提交表单。

刷新一下就会提示你是否要重复提交表单,这点在一些政务网站中比较常见。

所以这里说POST数据会被重新提交,涉及到增删改类的数据操作,确实显得有害。

总结

面试回答时候,我们没必要回答的那么繁琐,只要大概回答出以下几点即可。

  1. POST请求相对安全,GET请求相对不安全
  2. GET请求可以缓存,POST请求不能缓存
  3. GET请求有长度限制,POST请求没有长度限制
  4. GET只能传输字符串,POST可以传输多种类型数据
  5. GET请求入参在URL上,POST请求入参在Request body上
  6. POST有可能产生两个数据包,GET只会发送一个数据包
  7. 刷新和回退的时候GET请求无害,POST数据会被重新提交

结语

这个知识点确实是我之前欠缺了解了,不知道如今我的这份回答是否够详细,希望能入的了群友的法眼。

哎,面试要准备的题好多啊。

参考

GET请求和POST请求的区别,你还记得吗? - 掘金 (juejin.cn)

面试突击71:GET 和 POST 有什么区别? - 掘金 (juejin.cn)

淦,原谅我一直理解错GET和POST的请求的本质区别! - 掘金 (juejin.cn)

说一下 GET 和 POST 的区别? - 掘金 (juejin.cn)