2

假设我有一个像这样序列化为 JSON 的对象:

{ "Name" : "Mike",
  "Status" : "Too cool for school",
  "Looks" : "Devilishly good"}

现在,假设我有一个http://absoluteTruth.foo/ {id} (PUT) URI 来编辑这个对象。如果我使用包含以下内容的消息正文调用它:

{"Name" : "Michael"}

面对(不可能)试图改变其他两个值的请求时,幂等性的要求是什么?一方面,我可以看到上面的 PUT 请求应该产生一个这样序列化的对象:

{ "Name" : "Michael",
  "Status" : null,
  "Looks" : null}

这样,无论其他人做什么,我的 PUT 操作总是产生相同的输出。不幸的是,这对最终用户提出了要求,即他们执行 GET、更改接收到的数据并发回。(Rich Hickey 可能会告诫您完成各个字段的更新。)另一方面,我可以看到它可能会导致:

{ "Name" : "Michael",
  "Status" : "Too cool for school",
  "Looks" : "Devilishly good"}

因为我们可以说“状态”和“外观”的值的变化不属于 PUT 的副作用,当它被调用时只指定了“名称”参数。但是,从后续调用http://absolutetruth.foo/ {id} (PUT) 中返回的内容可能会不时发生变化,例如,如果其他人停下来对 Michael nee' Mike 的长相评分更高。

虽然我怀疑这不是一个惊天动地的问题,但我读过的各种 RFC,包括 2616,都不清楚这一点。我倾向于认为使用 {"Name" : "Michael"} 的 PUT 足够幂等,如果它不理会所有其他值,而不是压平它们。任何人都有权威来源的明确答案?

4

1 回答 1

0

HTTP 1.1 规定:

The PUT method requests that the enclosed entity be stored under the supplied 
Request-URI. If the Request-URI refers to an already existing resource, the 
enclosed entity SHOULD be considered as a modified version of the one residing 
on the origin server.

这意味着您发送的正文应被视为资源的整体表示。PUT幂等性是其结果。

如果您PUT {"Name" : "Michael"}在,/bar那么您的资源将不再提及其他“字段”。

如果要专门更改一个属性,则必须定义其他资源,例如/bar/name.

于 2013-03-24T07:44:25.420 回答