概念阐述
一个 HTTP 方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。所有的 safe 方法也都是幂等的。
幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同。需要注意的是,服务器不一定会确保请求方法的幂等性,有些应用可能会错误地打破幂等性约束。
Safe(安全)
如果说一个 HTTP 方法是安全
的,是指这是个不会修改服务器的数据的方法。也就是说,这是一个对服务器只读操作的方法。这些方法是安全的:GET
,HEAD
和 OPTIONS
。所有安全的方法都是idempotent的,但并非所有幂等方法都是安全的,例如,PUT
和 DELETE
都是幂等的,但不是安全的。
分析图表
HTTP Method | Idempotent 幂等 | Safe 安全 |
---|---|---|
OPTIONS | ✔️ | ✔️ |
HEAD | ✔️ | ✔️ |
GET | ✔️ | ✔️ |
POST | ❌ | ❌ |
PUT | ✔️ | ❌ |
PATCH | ❌ | ❌ |
DELETE | ✔️ | ❌ |
为什么put和delete是幂等,而patch则是非幂等的?
PUT【幂等】
PUT /user/1 #修改id为 1 的 user 的全部信息
用于更新资源,没有的话则执行创建操作。每次执行请求时都会先判断一下序号为1的User信息是否存在,不存在则创建,否则视为更新。很显然,请求携带的数据每次都是一样的,所以不论请求多少次,最终的结果都是后台存在这么一个资源(同内容覆盖式的更新或创建资源)。
PATCH【非幂等】
PATCH /user/1/house/3 #给id为1的user增加3个大房子
用于更新资源,即数据实体的一部分属性(局部修改),该数据必然存在,否则失去更新意义。每次执行请求时都会先判断一下序号为1的User信息是否存在,存在则更新数据信息。根据URL,我们需要处理的是将User的house属性增加3,很显然,多次请求时会重复增加,而无法保持为一个确定的值。PATCH 处于不可控的地位,所以说 PUT 方法是幂等的,而 PATCH 方法不是幂等的。
::: hljs-center
:::
标签:请求,RESTful,PATCH,user,PUT,服务器,方法 From: https://blog.51cto.com/u_16237732/7246172