HTTP区分两个属性:
幂等性由规范定义如下:
方法还可以具有“ 幂等 ” 的属性,因为(除错误或过期问题外)N> 0个相同请求的副作用与单个请求的副作用相同。的方法GET
,HEAD
,PUT
而DELETE
这种属性。而且,这些方法OPTIONS
和方法TRACE
不应有副作用,因此本质上是幂等的。
和安全:
特别是,已经建立了约定:GET
和HEAD
方法不应具有除检索之外的其他任何操作。这些方法应该被认为是“ 安全的 ”。这允许用户代理代表其他的方法,比如POST
,PUT
和DELETE
,以特殊的方式,让用户知道的是正在请求操作可能是不安全的事实。
自然地,不可能确保服务器不会由于执行GET
请求而产生副作用;实际上,一些动态资源认为该功能。这里的重要区别是用户没有要求副作用,因此不能对它们负责。
请注意,安全性意味着幂等:如果一种方法没有副作用,那么多次执行将产生与一次执行相同的副作用,即没有副作用。
这将方法分为三类:
- 安全(因而也幂等): ,
GET
,,HEAD
OPTION
TRACE
- 幂等,但并不一定安全:
PUT
,DELETE
- 既不是幂等也不安全的:
POST
PUT不需要有副作用。
那是错的。PUT
是幂等但不安全的。这样做的全部目的PUT
是产生副作用,即更新资源。幂等性意味着多次更新具有相同内容的相同资源应具有与仅更新一次具有相同的效果。
请注意有关安全性(强调我的部分)的最后一段:
自然地,不可能确保服务器不会由于执行GET
请求而产生副作用;实际上,一些动态资源认为该功能。这里的重要区别是用户没有要求副作用,因此不能对它们负责。
尽管这句话讲的是GET
安全性,但我们可以假设作者也打算对PUT
等幂和幂等使用相同的推理。IOW:PUT
应该只有一个用户可见的副作用,即更新命名资源。它可能还有其他副作用,但用户不承担任何责任。
例如,PUT
幂等的事实意味着我可以根据需要多次重试:规范保证多次执行与一次执行完全相同。创建旧修订的待办事项作为这些多个PUT
请求的副作用是完全有效的。但是,如果由于多次重试而导致您的数据库充满了旧版本的待办事项列表,那不是我的问题,那是您的问题。
爱荷华州:允许您有任意多的副作用,但是
- 它必须看起来像用户的请求是幂等的
- 您应对这些副作用负责,而不是用户