REST中PUT操作的幂等性要求的范围是什么?

REST中PUT操作的幂等性要求的范围是什么?,rest,side-effects,idempotent,Rest,Side Effects,Idempotent,假设我有一个序列化为JSON的对象,如下所示: { "Name" : "Mike", "Status" : "Too cool for school", "Looks" : "Devilishly good"} 现在,假设我有一个{id}(PUT)URI来编辑这个对象。如果我使用包含以下内容的消息正文调用它: {"Name" : "Michael"} 面对(不可能)试图改变其他两个值的请求,幂等性的要求是什么?一方面,我可以看到上面的PUT请求会导致一个对象序列化: { "Name"

假设我有一个序列化为JSON的对象,如下所示:

{ "Name" : "Mike",
  "Status" : "Too cool for school",
  "Looks" : "Devilishly good"}
现在,假设我有一个{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"}
因为我们可以说,当仅使用指定的“Name”参数调用PUT时,对“Status”和“Looks”值的更改不属于PUT的副作用。然而,如果有人路过,对Michael nee的评价更高,则随后对{id}(PUT)的调用返回的内容可能会不时发生变化


虽然我怀疑这不是一个惊天动地的问题,但我读过的各种RFC,包括2616,都不清楚这一点。我倾向于认为,如果将{“Name”:“Michael”}与所有其他值单独放置,而不是将它们展平,那么它就足够幂等了。任何人都有权威来源的明确答案吗?

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
幂等性就是这样的结果

如果
{“Name”:“Michael”}
放在
/bar
上,则资源将不再提及其他“字段”


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

Hmmm。我接受了它,但很勉强。:)看来“修改版”只是含糊不清的,不管怎样。如果我们说对象是JSON,那么扁平化是有意义的。如果对象仅仅表示资源的状态,那么我根本不清楚扁平化是否有意义。在我看来,web是基于一个文档模型的,其中负载就是事物,而RFC根本无法预测一个对象或数据模型,其中负载仅仅代表事物。HTTP 1.1的历史驳斥了这种以文档为中心的模型的观点。这确实是(见第2节)的结果。“was”是“be”的过去时,而不是现在时。这篇文章是最近的,但它的引用确实来自过去。Roy Fielding的论文和HTTP 1.1规范是这些非常抽象的讨论的结果,目的是构建一个非文档化的Web。这在很大程度上取决于“资源”的含义,它导致了当时所谓的“资源”。