Http 浅谈Get和POST的区别

1,499 阅读4分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

Http 浅谈Get和POST的区别

Get 和 POST 是HTTP协议中常用的两个方法。 虽然说是经典八股文了,但是总感觉理解得不是特别准确和深入。这篇文章主要是做个小总结和一些有争议的点的梳理。

一、Get 和 POST 是什么?

GETPOST 其实都是 HTTP 的请求方法。
除了这 2 个请求方法之外,HTTP 还有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 这 6 个请求方法。

二、特点

  • GET 用于获取信息,是无副作用的,是幂等的,且可缓存
  • POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存

三、区别

1. w3school标准答案

首先先放一下w3school标准答案。这里基本包括了常见的Get和POST的区别。

image.png

2. 区别汇总

HTTP协议规范层面:

  1. 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

安全性指的是非修改信息,即该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用,也就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
幂等性 (Idempotence) 则指的是无论调用这个URL 多少次,都不会有不同的结果的 HTTP 方法。而在实际过程中,这个规定没有那么严格。

这里幂等的概念和数学或计算机科学中的定义不太一样。


  1. 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

POST 请求天然就是非幂等的。

HTTP表现层面:

  1. GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
    POST把提交的数据则放置在是HTTP包的请求体中

    (1)从报文数据的角度分析,GET 和 POST 方法没有实质区别,只是报文格式不同。 在Get方法中将参数放置在请求体中,在POST方法中将参数放置在URL中,技术上是可行的,前提是服务端可以正确解析和处理。


  1. GET方式提交的URL是2048个字节,理论上POST没有限制。
    (1) GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。
    但是实际上,HTTP协议规范没有对URL长度进行限制,所以从协议规范层面来说URL不存在参数上限的问题。 这个限制是特定的浏览器及服务器对它的限制

    IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

    同时要注意的是,限制的是整个URL长度,而不仅仅是参数部分的数据长度。

    (2) HTTP协议规范没有对POST请求进行大小限制,所以从协议规范层面来说POST是没有大小限制的。 但是服务器的程序处理能力会起限制作用

四、一些不太确定的问题

  1. POST 方法会产生两个TCP数据包? 有些文章中提到,post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。

HTTP 协议没有明确规定 POST 会产生两个 TCP 数据包。

所以,header 和 body 分开发送是浏览器或框架的特定处理行为,并不是POST方法本身的性质。




参考文章:
都9102年了,还问GET和POST的区别
HTML 请求方法
浅谈HTTP中Get与Post的区别
GET 和 POST 的区别
GET和POST的区别详细解说