引用自http://www.garfieldtech.com/blog/put-up-with-put的问题(这是针对Drupal开源项目的,有点元,因为没有代码在这里):
GET、HEAD和PUT是幂等的,但“偶然”的副作用,如日志记录或统计信息收集,是可以的,不违反它们的幂等性。RFC 2616在幂等性方面有这样的说法:
方法也可以具有“幂等性”属性,即(除了错误或到期问题之外),N>0个相同请求的副作用与单个请求的副作用相同。方法GET、HEAD、PUT和DELETE共享此属性。(RFC 2616第9.1.2节)
我不清楚“副作用是一样的”限定语是什么意思。这是否意味着它可以重复相同的副作用,还是净零效应?
然后......我们一直允许前向修订,也就是创建一个尚未成为默认版本的新版本。这如何影响幂等性和PUT?如果创建了一个新的修订版,则重复PUT不是无操作。而是会创建另一个修订版。规范说:
一个资源可以由许多不同的URI标识。例如,一篇文章可能有一个用于标识“当前版本”的URI,该URI与标识每个特定版本的URI是分开的。在这种情况下,对通用URI的PUT请求可能会导致源服务器定义多个其他URI。
换句话说:
GET /node/5 {title: "Hello world"} GET /node/5/revision/8 {title: "Hello world"}
这完全符合规范。但是,以下代码怎么办?
GET /node/5 {title: "Hello world"} GET /node/5/revision/8 {title: "Hello world"} GET /node/5/revision/9 {title: "Bonjour le monde"}
这仍然是符合规范的行为吗?如果不是,是否意味着任何使用创建-读取-归档-清除(CRAP)模型而不是CRUD或支持前向修订的系统本质上不符合PUT兼容性?
GET、HEAD和PUT是幂等的,但“偶然”的副作用,如日志记录或统计信息收集,是可以的,不违反它们的幂等性。RFC 2616在幂等性方面有这样的说法:
方法也可以具有“幂等性”属性,即(除了错误或到期问题之外),N>0个相同请求的副作用与单个请求的副作用相同。方法GET、HEAD、PUT和DELETE共享此属性。(RFC 2616第9.1.2节)
我不清楚“副作用是一样的”限定语是什么意思。这是否意味着它可以重复相同的副作用,还是净零效应?
然后......我们一直允许前向修订,也就是创建一个尚未成为默认版本的新版本。这如何影响幂等性和PUT?如果创建了一个新的修订版,则重复PUT不是无操作。而是会创建另一个修订版。规范说:
一个资源可以由许多不同的URI标识。例如,一篇文章可能有一个用于标识“当前版本”的URI,该URI与标识每个特定版本的URI是分开的。在这种情况下,对通用URI的PUT请求可能会导致源服务器定义多个其他URI。
换句话说:
PUT /node/5 {title: "Hello world"}
结果是:GET /node/5 {title: "Hello world"} GET /node/5/revision/8 {title: "Hello world"}
这完全符合规范。但是,以下代码怎么办?
PUT /node/5 {title: "Bonjour le monde"}
结果是:GET /node/5 {title: "Hello world"} GET /node/5/revision/8 {title: "Hello world"} GET /node/5/revision/9 {title: "Bonjour le monde"}
这仍然是符合规范的行为吗?如果不是,是否意味着任何使用创建-读取-归档-清除(CRAP)模型而不是CRUD或支持前向修订的系统本质上不符合PUT兼容性?