2.2.6 network-网络-GET与POST的区别

233 阅读3分钟

前端GET与POST的区别

1. GET与POST的区别

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

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

  3. GET请求参数只能支持ASCII,而POST支持任意binary,包括中文

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

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

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

  7. GET参数通过URL传递,POST放在Request body中

2. 请求过程不同

2.1 post请求的过程

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器答应进行tcp连接(第二次握手)
  3. 浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
  4. 服务器返回100 Continue响应
  5. 浏览器发送数据
  6. 服务器返回200 OK响应

2.2 get请求的过程

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器答应进行tcp连接(第二次握手)
  3. 浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
  4. 服务器返回200 OK响应

以上观点是错误的

客户端可以利用HTTP的Continued协议来这样做:客户端总是先发送所有请求头给服务器,让服务器校验。如果通过了,服务器回复“100 - Continue”,客户端再把剩下的数据发给服务器。如果请求被拒了,服务器就回复个400之类的错误,这个交互就终止了。这样,就可以避免浪费带宽传请求体。但是代价就是会多一次Round Trip。如果刚好请求体的数据也不多,那么一次性全部发给服务器可能反而更好。

基于此,客户端就能做一些优化,比如内部设定一次POST的数据超过1KB就先只发“请求头”,否则就一次性全发。客户端甚至还可以做一些Adaptive的策略,统计发送成功率,如果成功率很高,就总是全部发等等。不同浏览器,不同的客户端(curl,postman)可以有各自的不同的方案。不管怎样做,优化目的总是在提高数据吞吐和降低带宽浪费上做一个折衷。

因此到底是发一次还是发N次,客户端可以很灵活的决定。因为不管怎么发都是符合HTTP协议的,因此我们应该视为这种优化是一种实现细节,而不用扯到GET和POST本身的区别上。更不要当个什么世纪大发现。

3. 关于URL的长度

不论是GET和POST都可以使用URL传递数据,所以我们常说的“GET数据有长度限制“其实是指”URL的长度限制“。

4. 安全性

HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body

必须做从客户端到服务器的端端加密。业界的通行做法就是https

5. 参考文章

听说『99% 的人都理解错了 HTTP 中 GET 与 POST 的区别』??

GET 和 POST 到底有什么区别?