返回哪个 HTTP 状态码,404 还是 422?

11
我有一个Rails API应用程序,其中包含下一个资源:/images。 所有图像都有一个owner
要创建新图像,我向/images发出以下请求:
image_info = { owner_id: '1234', name: 'img1' }

post :create, :format => "json", :image => @image_info

在图像控制器中我执行:
owner = User.find( params[:owner_id] )

如果owner_id不存在或无效,后端应该返回什么错误代码,404还是422与owner_id:invalid一起?
3个回答

11

因为您未能完成请求的处理,所以我将我的答案更改为422。"Unprocessable entity"(无法处理的实体)是更好的匹配,因为您没有请求对象,所以"not found"(未找到)并没有太多意义。最终选择取决于您,只需选择您感觉更好的。

422 Unprocessable Entity(WebDAV;RFC 4918)

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

来源:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error


1
返回“404”在网络上可能会让人感到困惑。如果我看到“404”,我会怀疑请求路径,而实际上请求路径是正确的。“400”也不适用,因为请求在语法上是正确的。所以,“422”才是最好的选择。 - Christian Hujer

2
首先,我认为这个问题不应该只针对Ruby,因为它适用于大多数Web应用程序。
根据Mozilla的开发指南https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
引用: “超文本传输协议(HTTP)422不可处理实体响应状态代码表示服务器理解请求实体的内容类型,并且请求实体的语法正确,但是无法处理包含的指令。”
我会选择使用代码422,因为请求路径和提供的数据都是正确的,但是没有这样的实体。此外,描述中还说 - 请求在未经修改的情况下不应重复 - 这种情况适用。 当请求路径错误时,我认为404最合适。将其用于其他任何事情都会让发送请求的人感到困惑,因为它没有提供足够的信息。如果您在这种情况下返回404,我会感到困惑并认为我将请求发送到了错误的URI。希望这能帮到您。

0

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

(在这里找到)

由于情况并非如此,我会选择404。查询有效,但未找到对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接