错误输入应该使用什么HTTP状态码

问题描述 投票:0回答:4

当不报告 200(一切正常)但输入错误时,最佳 HTTP 响应代码是什么?

比如,你向服务器提交一些数据,服务器会回复你的数据错误

使用

500
看起来更像是服务器问题
200
与警告/错误响应文本一起使用是不好的(允许缓存,但一切都不正常)
使用
204
并且不返回任何内容,也许很好(但得到很好的支持?)
如果请求的路径(脚本)可用并且位于正确的位置,则使用
404
是错误的

validation http
4个回答
352
投票

我们在制作 API 时也遇到了同样的问题。我们正在寻找相当于

InvalidArgumentException
的 HTTP 状态代码。阅读下面的源文章后,我们最终使用了
422 Unprocessable Entity
,其中指出:

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

来源:https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm


159
投票

以 4 (4xx) 开头的代码表示客户端错误。也许 400(错误请求)适合这种情况? http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中的定义说:

“由于语法错误,服务器无法理解该请求。客户端不应在未经修改的情况下重复该请求。”


16
投票

409 Conflict
可能是一个可以接受的解决方案。

根据:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

由于与资源的当前状态冲突,请求无法完成。仅在预期用户能够解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应该包含足够的信息,以便用户识别冲突的根源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;然而,这可能是不可能的,也不是必需的。

文档继续举例:

响应 PUT 请求时最有可能发生冲突。例如,如果正在使用版本控制,并且正在 PUT 的实体包含对资源的更改,这些更改与早期(第三方)请求所做的更改相冲突,则服务器可能会使用 409 响应来指示它无法完成请求。在这种情况下,响应实体可能会以响应内容类型定义的格式包含两个版本之间的差异列表。


就我而言,我想通过 API 将一个字符串(必须是唯一的)放入数据库。在将其添加到数据库之前,我检查它是否已经存在于数据库中。

如果是的话,我会回来

"Error: The string is already in the database", 409

我相信这就是OP想要的:适合数据未通过服务器标准时的错误代码。


0
投票

矛盾的是,

202 Accepted
在这种情况下可能会有所帮助,特别是对于异步处理。

超文本传输协议 (HTTP) 202 已接受响应状态 代码表示请求已被接受处理,但是 处理尚未完成;事实上,处理可能不会 已经开始了。该请求最终可能会或可能不会被执行 在此基础上,因为实际进行处理时可能会不允许

© www.soinside.com 2019 - 2024. All rights reserved.