未找到的子实体的正确HTTP状态代码是什么?

时间:2017-02-09 11:42:18

标签: http

说我有资源

/Products/123

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

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

404 Not Found,其中包含指定未找到哪个资源的消息?

409 Conflict

3 个答案:

答案 0 :(得分:5)

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(不可处理的实体)状态代码表示服务器     了解请求实体的内容类型(因此a     415(不支持的媒体类型)状态代码不合适),以及     请求实体的语法是正确的(因此400(错误请求)     状态代码不合适但是无法处理包含的内容     说明。例如,如果是XML,则可能会出现此错误情况     请求正文包含格式正确(即语法正确),但是     语义错误的XML指令。

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

Picking the right 4xx status code

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

6.5.4. 404 Not Found

  

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

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

我认为他们之间存在关系的供应商和产品,这是一种艰难的关系,如果您没有该产品的供应商,产品就不可能存在,这意味着如果您不能更新产品,你不知道它是供应商。