【问题标题】:What is the correct HTTP status code for a child entity that is not found?未找到的子实体的正确 HTTP 状态代码是什么?
【发布时间】:2017-06-27 09:50:03
【问题描述】:

说我有资源

/Products/123

并且每个Product 在后端数据库中都有一个关联的Supplier 实体。 POST 和 PUT 请求必须指定供应商 ID,然后用于从数据库中获取供应商实体。

如果用户发出PUT /Products/123,已找到,但包含错误的供应商 ID,不是,应该返回什么?

404 Not Found 显示未找到哪个资源的消息?

409 Conflict?

【问题讨论】:

  • 你考虑过422吗?

标签: http


【解决方案1】:

404 状态码可能不是正确的选择,因为尚未找到的资源不是您请求的目标:

6.5.4. 404 Not Found

404(未找到)状态码表示源服务器已 找不到目标资源的当前表示或不是 愿意透露一个存在。 404 状态码不 表明这种缺乏代表权是暂时的还是 永恒的; 410 (Gone) 状态码优先于404,如果 原始服务器可能通过一些可配置的方式知道, 这种情况很可能是永久性的。

409 状态码可能适合这种情况,但不是最佳选择(我不会将这种情况定义为冲突):

6.5.8. 409 Conflict

409(冲突)状态码表示请求无法 由于与目标的当前状态冲突而完成 资源。此代码用于用户可能 能够解决冲突并重新提交请求。服务器 应该为用户生成一个包含足够信息的有效载荷 认清冲突的根源。 [..]

我会选择422 状态码,并在响应负载中明确描述:

11.2. 422 Unprocessable Entity

422(不可处理实体)状态码表示服务器 理解请求实体的内容类型(因此 415(不支持的媒体类型)状态码不合适),并且 请求实体的语法是正确的(因此是 400 (Bad Request) 状态码不合适)但无法处理包含的 指示。例如,如果 XML 请求正文包含格式正确(即语法正确),但是 语义错误的 XML 指令。

如果422 不适合您,请使用通用的400:

6.5.1. 400 Bad Request

400(错误请求)状态码表示服务器不能或 由于某些被认为是 客户端错误(例如,格式错误的请求语法、无效请求 消息框架或欺骗性请求路由)。


在选择最合适的4xx 状态码时,下图(摘自this page)非常有见地:

【讨论】:

    【解决方案2】:

    您好,我会使用前面提到的 404:

    6.5.4. 404 Not Found

    404(未找到)状态码表示源服务器已 找不到目标资源的当前表示或不是 愿意透露一个存在。 404 状态码不 表明这种缺乏代表权是暂时的还是 永恒的; 410 (Gone) 状态码优先于 404 原始服务器可能通过一些可配置的方式知道, 这种情况很可能是永久性的。

    因为你要找的产品存在,但是供应商ID不存在,所以基本上就像我们在另一个城市找你一样,你存在但不在那个城市,所以我们会说,嘿我们没有找到你了。

    我相信供应商和产品之间存在关系,这是一种硬关系,如果您没有该产品的供应商,则该产品将不存在,这意味着如果您没有该产品,您将无法更新产品'不知道它是供应商。

    【讨论】:

      【解决方案3】:

      我不相信这个问题有一个正确的答案(除非一些 REST 纯粹主义者可以阐明)但我们目前使用(或滥用......)HTTP 400(不好请求),并带有解释错误的附加 HTTP 标头(即 X-Error:无效的供应商 ID)。但是,HTTP 422 也是一个不错的选择。 状态 404 或 409 会令人困惑,因为没有明确的方法来指定响应是关于子资源的。

      【讨论】:

      • 是否也可以接受返回 404 以及说明“未找到 ID 为 999 的供应商”之类的消息负载,从而消除混淆?
      • @BCA 始终欢迎响应负载中的消息来说明问题。 404 适用于无法找到请求的资源时。在这种情况下,请求的资源(ID 为 123 的产品)存在并且可以找到,但请求有效负载(包含无效数据)存在问题。因此,422 可以很好地描述错误。
      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 2018-02-24
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多