关注「Java视界」公众号,获取更多技术干货

get请求和post请求的区别?分别在哪些情况下使用?从根上理解!

一、表象

说到GET和POST请求的区别,大家都知道:GET把参数包含在URL中,明文不安全,最大支持2KB;POST通过request body传递参数,不显示、安全且不限制大小。再详细一点的:

  • GET在浏览器回退时是无害的,而POST会再次提交请求。

  • GET产生的URL地址可以被Bookmark,而POST不可以。

  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。

  • GET请求只能进行url编码,而POST支持多种编码方式。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  • GET请求在URL中传送的参数是有长度限制的,而POST么有。

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  • GET参数通过URL传递,POST放在Request body中。

但是上面的仅仅只是“现象”层面的,不是本质上,不禁想问为什么会有以上的区别?为什么最大支持2KB?为什么会有GET和POST请求?

二、本质

那还要从HTTP协议说起,HTTP是基于TCP/IP的关于数据如何在网路中如何通信的协议,HTTP的底层依赖TCP/IP。而GET和POST是HTTP协议其中的两种发送请求的方法,所以GET和POST的底层也依赖TCP/IP,都是TCP链接。也就是说:GET和POST本质上没区别,以上区别都是人为划分的人为制造的。假如给GET加上request body,给POST带上url参数,理论上是完全行的通的。

那你肯定又有一个很大的疑问:既然本质上都是一样的,那为什么还要人为搞成不一样的?回答这个前,试想一下,假如世界上每个人都长一样会怎样?

在网络中,TCP/IP就像汽车用来运输数据,如果路上跑的全是看起来一模一样的汽车,那就会出现没人给救护车让路的事情,因为没人知道这是一台救护车。所以尽管都是车,但要对不同用途的车进行区别,这样什么车走什么道,什么时候走就可以通过相关规则进行控制,提高通行效率和安全性。、

而HTTP就好比是交通规则,HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等。这样就给车贴上了不同的标签,在互联网传输过程中就可以根据这些标签做不同的处理。比如:如果要运输一些安全性较高的数据,HTTP就给车贴上是POST标签,把数据放进后备箱谁也看不见,到了目的地打开后备箱才能看见;如果对传输效率要求较高,那就贴上GET标签,不用费功夫塞到后备箱,放在车顶就行,且一路还有交警开道护送。也就是根据不同的需求给车贴上不同的标签。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

说到这里就可以顺便解释一下为啥GET请求最大支持2KB了,数据量太大对浏览器和服务器都是很大负担。大多数浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。

超过的部分,就不会被处理。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司,运输过程中装货和卸货也是有很大成本的,因此通过限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。如果用GET服务,在request body传入了数据,不同服务器的处理方式也是不同的,有些服务器会读出数据,有些服务器会直接忽略,虽然GET可以带request body,也不能保证一定能被接收到。就像上面的例子,GET时车顶上面的东西不能堆太多,要有限制且最好不要在后备箱塞东西,卸货员可能会忽略后备箱的货物。

三、本质背后

上面说到的,GET和POST本质上没区别都是依赖TCP/IP链接。HTTP之所以划分出GET, POST, PUT, DELETE等请求类型,是为了满足不同的需求。那你肯定又有疑问了:底层都是TCP,那怎么实现以上不同的呢?比如GET请求的最大2KB是在哪验证的呢?

GET, POST, PUT, DELETE等不同请求类型的不同处理策略是通过数据包控制的。

比如:GET产生一个TCP数据包;POST产生两个TCP数据包。

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

  • 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。但不能认定GET请求效率一定就比POST的高,因为在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点,另外并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

四、POST和GET的使用场合

POST方法:
* 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
* 若使用GET方法,则表单上收集的数据可能让URL过长。
* 要传送的数据不是采用7位的ASCII编码。

GET方法:
* 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
* 请求结果无持续性的副作用。
* 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符。

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

 

posted @ 2022-06-25 14:03  沙滩de流沙  阅读(271)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货