Last Updated on

前言

在Web开发中,最常见的Http请求,Get请求和Post请求,使用最广,一般在初级的面试中,会时不时问起这个基础问题。

这个问题看起来简单,但实际有一些坑,这里就详细说明一下这两种请求方式的区别

正文

首先,直接给出答案:

  • Get请求和Post请求,本质上没有什么区别

此时你可能一脸懵逼,没有区别,干嘛要问,很多时候就是看你能不能理解其本质上的无区别,和日常表现中的有区别。


首先,来看下日常表现出的有区别,这种区别有很多,比如:

  • get请求将参数传递编码在url中进行传递,post请求是将数据放在body中进行传递
  • 由于url长度有限制,一般比body能传递的数据少,所以get请求传递的数据量不如post请求
  • 由于body可以通过ssl证书加密进行传递,url却不能,所以post请求更安全
  • 由于body中可以发送更多数据类型,url却不能,所以post请求能发送更多的数据类型,get请求只能发送ASCII字符
  • get请求用于请求查询数据,不会造成修改,所以时安全请求,post可能会修改数据
  • get请求可以被缓存,post请求不能
  • get请求可以被保存在浏览器历史记录中,post不能
  • get能被保存书签,post不能
  • get在浏览器回退时是无害的,而post会再次提交请求
  • 。。。

以上只是一些常见的主要区别,可能还有很多其他的种种,看起来好像区别很大,但是为什么说本质上没有区别呢?


下面来看看为什么说本质上没有区别

首先,我们知道,get请求和post请求,都是http协议中的不同请求方式

而http是什么?http是基于tcp/ip的关于数据如何在万维网中如何通信的协议

所以,本质上,get和post都是在tcp链接下的数据传输,传输的报文则是以http协议的形式进行,因为get和post本质上是http协议的不同请求方式而已嘛,那么看下http的报文格式:

可以看到,http的报文时一样的格式,get和post的区别无非是报文中的请求方法的数据不一样,而其他的数据,在技术上则是都可以设置为一样的。

也就是说,Get请求也可以在body中传递数据,post请求也可以在url中传递数据,且他们也只负责数据传递,传递的数据会导致什么结果和返回,则完全取决于服务端的代码,跟请求本身并没有任何关系

比如,我完全可以用get请求去创建用户,可以用post请求来获取用户数据。


那么既然本质上没有什么区别,那为什么还会表现出很多的区别,包括在浏览器上也很不一样呢?

答案很简单: 因为规范!所以导致了众多表现上的区别

如果将网络中的tcp请求,都看着是一辆辆货车,那么http协议就是为了能让路上的车辆高效规范运行的交通规则,所以Http规范了多种请求方式,请求的数据格式,返回的格式,返回的状态码等等,来作为使用规范。

然后表现出的不同的区别,比如可以缓冲get请求的静态数据呀,保存书签呀,url长度不如body长之类的,都是浏览器和服务端根据Http规范进行的一些区别设置罢了。

且编码人员和服务端也更具这些规范来进行标准化的编码,更高效整洁易维护。且在http的规范上,更近一步提出了Rest风格来规范Web服务设计,且广泛使用并逐渐成为Web接口设计的标准规范。想详细了解请看阮一峰的着篇文章

到此,大家应该也就明白了为什么Get与Post本质上没有什么区别

最后,实际上,Get与Post还是有一点点本质上的区别的,那就是:

一个Get请求只发送一次,Post请求会分两次发,但是这是否会导致get比post效率更高,详细可以看:https://zhuanlan.zhihu.com/p/25028045 也可以自己实验看看。

到这里,基本已经跟面试官问你这个问题的初衷相去甚远了,只要表达出你对其表现和本质上的认识应该也就ok了。

结束

最后,网上的文章和说法,千奇百怪,有各种可能自相矛盾的说法,大多都是转载,复制,或者并没有严谨测试得出的结论。

各位在看过各种文章后,作为一个明事理的文化人,希望能保持自己的怀疑性,多审视,不要盲目相信任何东西,而且即使原因相信的东西,也可能会在日后发现是错的。

保持独立思考!