假设我有一个像这样序列化为 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 足够幂等,如果它不理会所有其他值,而不是压平它们。任何人都有权威来源的明确答案?