2

引用来自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 节)

我不清楚“副作用是一样的”限定词。这是否意味着它可以是相同副作用的重复,或净 0 效应?

然后......我们一直允许向前修订,即创建一个尚未成为默认版本但将成为默认版本的新版本。这对幂等性和 PUT 有何影响?如果创建了新修订,则重复 PUT 不是无操作。相反,它将创建另一个修订版。规范说:

单个资源可以由许多不同的 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"}

这仍然是规范有效的行为吗?如果不是,这是否意味着任何使用 Create-Read-Archive-Purge (CRAP) 模型而不是 CRUD 或支持正向修订的系统本质上不是 PUT 兼容的?

4

1 回答 1

2

创建版本资源作为副作用很好。重要的是客户端要求什么,而不是服务器决定做什么。

请参阅http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-21.html#idempotent.methods——现在是时候停止查看 RFC 2616。

于 2012-10-18T14:34:59.453 回答