post、get的里里外外

2333

说不清,道不明的两兄弟!今天就从里里外外深究下。

使用上区别
  1. GET在浏览器回退是无害,POST会再次提交请求。
  2. GET产生的URL地址可以被收藏,而POST不可以。
  3. GET请求会被浏览器主动缓存,而POST不会,除非主动设置。
  4. GET可保存到浏览器历史记录中,而POST参数不会保留。
  5. GET更不安全,因为参数暴露在URL上,不能传送敏感信息。
  6. GET参数通过URL传递,POST放在Request body中。
  7. GET只能通过url编码,而POST支持多种编码。
  8. GET请求在url中传送的参数有2kb左右限制(假如超过2kb的情况下服务器返回"414"http状态码),POST没有。

备注:你发现现在很多公司的后端都是清一色的POST请求(大多数前端都是一脸懵逼不知道为什么),其实是为了防止CRST攻击。

本质区别

GET和POST重大区别在于 GET 产生一个TCP数据包,而 POST 产生两个TCP数据包。

在万维网中TCP就像汽车,我们用TCP来运输数据,它可靠从来不会出现丢件少件的情况,IP就是我们目的地。但是在路上看起来跑的都是一模一样的汽车,那这个设计就一团乱了,送急件的可能被满载获取的车赌在路上,会导致整个交通系统瘫痪,为了避免这种情况发生,交通规则(HTTP)诞生了,HTTP给汽车运输设定了好几个服务类别,有GET、POST、PUT、DELETE等等,当执行不同类别请求时会给汽车贴上不同标签。

对于GET方式请求,浏览器会把HTTP header和data一并发生出去,服务器响应200(返回数据),而POST浏览器先发生header,服务器响应100,浏览器在发送data,服务器响应200 (主要是因为 nagle算法的原因)。

也就是说,GET只需汽车跑一次就把货送到了,而POST需要跑两趟,第一趟先去和服务器大概招呼,然后再回头把货送过去。

据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,而在网络差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

终极区别(算是吧)

GET和POST最大的区别主要是GET请求是幂等性的,POST请求不是。
正因为它们有这样的区别,所以不应该且不能用get请求做数据的增删改这些有副作用的操作。因为get请求是幂等的,在网络不好的隧道中会尝试重试。如果用get请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用(浏览器和操作系统并不知道你会用get请求去做增操作)。

需要参考的文章

HTTP POST请求发送两个TCP包?