不允许部分PUT背后的理由是什么?

Mik*_*ike 17 rest http

为什么HTTP PUT请求必须包含"整体"状态的表示,而不能只是部分?

我知道这是PUT的现有定义 - 这个问题是关于为什么以这种方式定义的原因.

即:

通过阻止部分PUT获得了什么?

为什么阻止幂等部分更新被视为可接受的损失?

Jan*_*sen 16

PUT表示HTTP规范定义的含义.客户端和服务器无法改变这种含义.如果客户端或服务器以与其定义相矛盾的方式使用PUT,则至少可能发生以下情况:

根据定义,Put是幂等的.这意味着客户(或中间人!)可以重复任何次数的PUT,并确保效果相同.假设中间人从客户端接收PUT请求.当它将请求转发到服务器时,存在网络问题.中间人根据定义知道它可以重试PUT直到它成功.如果服务器以非幂等方式使用PUT,则这些潜在的多个调用将产生不希望的影响.

如果要进行部分更新,请使用PATCH或在子资源上使用POST并返回303参见"其他"资源,例如


POST /account/445/owner/address
Content-Type: application/x-www-form-urlencoded

street=MyWay&zip=22222&city=Manchaster


303 See Other
Location: /account/445
Run Code Online (Sandbox Code Playgroud)

编辑:关于一般问题,为什么部分更新不能是幂​​等的:

部分更新通常不是幂等的,因为幂等性取决于媒体类型语义.IOW,您可能能够指定允许幂等补丁的格式,但不能保证PATCH在每种情况下都是幂等的.由于方法的语义不能是媒体类型的函数(出于正交性原因),PATCH需要被定义为非幂等的.并且PUT(被定义为幂等)不能用于部分更新.

  • 我没有看到部分PUT打破幂等性.当然,实现可以打破这一点,就像GET一样.此外,RFC并未严格提及PUT不能是部分的. (4认同)
  • 嗨Jan,正如我已经说过的那样; "我知道这是PUT的现有定义 - 这个问题是关于为何这样定义的原因".您在第2段中的示例意味着部分更新是非幂等的 - 显然这就是PATCH的用途.我对*幂等*部分更新感兴趣 - 即部分PUT. (3认同)
  • HTTP1.1bis现在明确表示PUT不适用于部分更新:http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-20#section-2.3.5(倒数第二段) (3认同)
  • FWIW 在讨论的后期,有几个关于为什么部分更新仅与所涉及的媒体类型相关的幂等示例:日志文件的补丁(例如,保留最后 1000 行的实时聊天板)部分更新该文件,但重新提交会多次添加相同的条目,表现为对集合的 POST。然后,您可以使用 PATCH 来更新一个人的姓名,如果重新提交(幂等),每次都会导致相同的结果。HTTP 规范的存在是有原因的,伙计们。PUT 具有既定的和预期的行为。 (3认同)