【问题标题】:REST Should we treat empty updates as SUCCESS?REST 我们应该将空更新视为成功吗?
【发布时间】:2015-03-18 16:36:18
【问题描述】:

只是在构建 RESTful 服务时出于好奇提出一个问题,如何处理更新时的空差异?

假设我们在创建时有一个如下的对象“Person”:

人{ 编号:123, 名字 : "Foo", 姓氏:“酒吧”, 年龄:“酒吧” }

在更新人员的详细信息时,如果客户端传递了用于更新 ID 为 123 的人员的空参数,服务器是否应将此视为

  1. 成功(因为没有什么可更新的)?或
  2. 返回 SUCCESS(但告诉用户没有要更新的内容)或
  3. 抛出错误请求

最喜欢的方式是什么?

【问题讨论】:

  • 我会返回 404 错误..
  • 什么叫更新? REST 不是 CRUD。你说的是哪种 HTTP 方法?

标签: rest http


【解决方案1】:

我会选择422。在执行实际更新之前检查请求。如果没有更新参数,则退出并返回 422。

422 无法处理的实体

请求格式正确,但由于语义错误而无法执行。

资源找到了,url存在,更新成功(虽然没有做任何事情)并且请求没有畸形,所以404和400都不对。

您可以使用 200 OK,但我个人会使用 422 because 4xx status codes have an extra indication that the client made a 'mistake'。而且我认为没有参数的更新请求是错误的。

【讨论】:

  • 但只是为了比较和对比其他实体,“patch”unix 命令将空差异视为成功,而不会抱怨为错误。我知道这是不同的语义,但在处理差异方面几乎足够接近。
  • 更新资源与 Unix 补丁的操作并不完全相同。更新资源时,您没有进行差异化,您只是在更新传入的任何内容。更新过程中没有差异
  • 更新与对资源应用“差异”(修改)不同吗?本质上两者是相同的。再说一次,这正是我的感受。
【解决方案2】:

这取决于您为该人提供空提示的方式。

如果您将内容与PUT 方法一起使用,则提供的内容将完全替换资源状态。所以我认为这不是正确的,因为你期望什么都不会发生。在这种情况下,应该在状态码和内容中返回错误。我同意 Tim 的观点,即应该使用错误 422(它通常在 Web API 中使用,例如来自 Github 的那个 ;-))。但请注意,此代码是 WebDAV 规范的一部分,一些 REST 纯粹主义者更喜欢通用错误 400,并在有效负载中包含详细信息。

如果使用PATCH方法,则对应资源状态的部分更新。我认为在这种情况下,不会返回任何错误,但不会为资源状态更新任何内容。

也许这个链接可以给你额外的提示:https://templth.wordpress.com/2014/12/15/designing-a-web-api/

希望对你有帮助 蒂埃里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2017-09-22
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多