说我有资源
/Products/123
每个Product
在后端数据库中都有一个关联的Supplier
实体。 POST和PUT请求必须指定供应商ID,然后使用该ID从数据库中获取供应商实体。
如果用户发出PUT /Products/123
, ,但包含错误的供应商ID,不,应该返回什么?
404 Not Found
,其中包含指定未找到哪个资源的消息?
409 Conflict
?
答案 0 :(得分:5)
404
状态代码可能不是正确的选择,因为尚未找到的资源不是您的请求的目标:
404
(未找到)状态代码表示源服务器已执行 找不到目标资源的当前表示,或者不是 愿意透露一个存在。404
状态代码没有 表明这种缺乏代表性是暂时的还是暂时的 常驻;410
(Gone)状态代码优先于404
原始服务器可能通过一些可配置的方式知道 这种情况可能是永久性的。
409
状态代码可能适合这种情况,但不是最佳选择(我不会将此情况定义为冲突):
409
(冲突)状态代码表示请求不能 由于与目标的当前状态发生冲突而完成 资源。此代码用于用户可能的情况 能够解决冲突并重新提交请求。服务器 应该生成一个包含足够用户信息的有效负载 认识到冲突的根源。 [..]
我会在响应有效负载中使用明确的描述来获取422
状态代码:
11.2. 422 Unprocessable Entity
422
(不可处理的实体)状态代码表示服务器 了解请求实体的内容类型(因此a415
(不支持的媒体类型)状态代码不合适),以及 请求实体的语法是正确的(因此400
(错误请求) 状态代码不合适但是无法处理包含的内容 说明。例如,如果是XML,则可能会出现此错误情况 请求正文包含格式正确(即语法正确),但是 语义错误的XML指令。
以下图表(摘自this page)在选择最合适的4xx
状态代码时非常有见地:
答案 1 :(得分:2)
我不相信这个问题有正确的答案(除非某些REST纯粹主义者可以解释一下)但我们目前使用(或滥用......)HTTP 400
(错误请求),附加HTTP标头解释错误(即X-Error:无效的供应商ID)。但是HTTP 422也是一个不错的选择。
状态404或409会令人困惑,因为没有明确的方法来指定响应是关于子资源的。
答案 2 :(得分:0)
您好我会使用前面提到的404:
404(未找到)状态代码表示源服务器已执行 找不到目标资源的当前表示,或者不是 愿意透露一个存在。 404状态代码没有 表明这种缺乏代表性是暂时的还是暂时的 常驻;如果是,410(Gone)状态代码优先于404 原始服务器可能通过一些可配置的方式知道 这种情况可能是永久性的。
因为您正在寻找的产品存在,但供应商ID不存在,所以基本上就像我们在不同的城市寻找您,您存在但不在那个城市,所以我们会说,嘿,我们没有找到了你。
我认为他们之间存在关系的供应商和产品,这是一种艰难的关系,如果您没有该产品的供应商,产品就不可能存在,这意味着如果您不能更新产品,你不知道它是供应商。