HTTP协议:简析GET和POST的区别

236 阅读4分钟

HTTP请求

在浏览器表现上,资源代指可见、不可见的元素,包含图片、html、css等,构成了我们能够正常访问的页面。HTTP协议使用URI定位互联网上的资源,URI相当于资源在互联网中的地址,当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。

HTTP请求方法

根据请求资源的意图,可以将HTTP分为以下几种方法:

  • GET:获取资源
  • POST:提交要被处理的主体内容
  • HEAD:与 GET 相同,但只返回 HTTP 报头,不返回主体内容
  • PUT:传输文件,在主体中包含文件内容,保存到请求URI的指定位置
  • DELETE:删除URI指定的资源
  • OPTIONS:询问请求资源支持的方法
  • CONNECT:把请求连接转换到透明的 TCP/IP 通道。

日常开发中,我们接触到最多的请求方法就是GET和POST,谈到它们的区别,首先想到的请求参数位置、安全性、浏览器表现等。

对比GET和POST请求的区别

从浏览器的表现

绝大多数场景下,浏览器作为发起HTTP请求的客户端,向客户端请求资源,不同请求方法对使用者带来最直观的区别是什么呢?

GET POST
书签 可以被收藏为书签 不可以被收藏为书签
历史记录 参数保留在浏览器历史中 参数不会保存在浏览器历史中
参数可见 url显示参数 参数在提交表单中
缓存 浏览器主动缓存 除非手动设置,不会主动缓存
参数长度限制 受到浏览器或操作系统的长度限制 无限制
支持字符集 ASCII 没有限制。也允许二进制数据。
编码方式 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。

从服务器处理请求角度

GET POST
参数获取 请求url获取参数,cookie也可以当做参数传递的一种途径 需要Content-Type头区分不同的格式,再对主体进行解析
长度限制 出于对安全性和性能的考虑,多数服务器会限制url最大长度,但这不是HTTP标准要求的内容 无限制

安全性

前面提到,GET请求的参数显示在url中,而POST请求参数对使用者不可见,会有人想到POST比GET安全性更好。POST相对来说,比GET请求安全性好,因为不会缓存使用者输入的参数,其他人不会通过浏览历史获得数据。除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。

从安全角度来说,在HTTP里,无论是POST和GET都是不安全的。

对于HTTP请求来说,因为都是通过明文传输,所以通过抓包工具获取具体传输的内容。因此,对于安全性有考虑的话,使用HTTPS更好一些,搜索引擎对HTTPS也更加友好。

下层协议--TCP

无论GET或者POST请求,最后都会经过TCP连接传输,不同请求方法对于TCP层来说会有影响么?

在一些浏览区或框架的实现中,的确会出现POST发送两次TCP请求,而GET请求只发送一次,但不是必然的。

HTTP协议中没有要求GET发送一个数据包;POST请求会先发送header,之后再发送data,会产生两个数据包。

从业务的角度考虑

从业务来说,保证接口的幂等性十分重要。简单解释一下幂等性,对于服务器资源来说,一次请求和重复请求对系统的影响是一致的。举个简单的例子,对于用户发起的充值10元,可能会因为网络延迟或恶意伪造等,会有两次一样的HTTP请求到达服务器,对于服务器来说,只会产生一次充值行为。

GET用于获取资源,应该是无副作用,安全和幂等的。

POST会对系统资源更新,应该认为保证幂等性。

参考文章:

HTTP 方法:GET 对比 POST
99%的人理解错 HTTP 中 GET 与 POST 的区别
GET和POST区别