前言:
日常开发中,前端向后端请求数据,基本用的都是http请求,请求常用的方法无非就是GET和POST,本文就探讨一下为什么GET请求就是只能请求数据,而POST请求则可以修改数据。
从原理性看:
- 根据HTTP规范,GET用于信息获取,而且应该是安全和 幂等的
- 根据HTTP规范,POST请求表示可能修改服务器上资源的请求
- 正因为它们有这样的区别,所以不应该且不能用get请求做数据的增删改这些有副作用的操作。因为get请求是幂等的,在网络不好的隧道中会尝试重试。如果用get请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用
什么是幂等性?
如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) = f(f(x)) ,那么该 f 运算具有幂等性(重复操作)
从表面上看:
- GET请求的数据会附在URL后面,POST的数据放在HTTP包体
- POST安全性比GET安全性高
其他:
- GET请求参数通过URL传递,POST的参数放在请求体中。
- GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把请求头和请求体一并发送出去;而对于POST,浏览器先发送请求头,服务器响应100 continue,浏览器再发送请求体。
post方法真的会会产生两个tcp数据包吗?
有些文章中提到,POST 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。
HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。
所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。