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

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

使用500看起来更像是服务器问题 使用200警告/错误响应文本是不好的(允许缓存和一切都不是OK) 使用204而不返回任何内容,可能是好的(但是否得到了良好的支持?) 如果请求的路径(脚本)可用并且在适当的位置,则使用404是错误的


当前回答

当客户端请求一些服务器无法处理的荒谬请求时,我建议使用418。比如服务器是一个茶壶,但客户是要求咖啡之类的东西。以下是所有(400-499)客户端错误消息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses

其他回答

以4 (4xx)开头的代码用于处理客户端错误。也许400(坏请求)可以适用于这种情况?http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中的定义如下:

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

404 -未找到-用于请求的URI无效或所请求的资源(如用户)不存在。

我们在制作API时也遇到了同样的问题。我们正在寻找等价于InvalidArgumentException的HTTP状态代码。在阅读了下面的文章后,我们最终使用了422 Unprocessable Entity,它表示:

The 422 (Unprocessable Entity) status code means the server understands the content type of the request entity (hence a 415 (Unsupported Media Type) status code is inappropriate), and the syntax of the request entity is correct (thus a 400 (Bad Request) status code is inappropriate) but was unable to process the contained instructions. For example, this error condition may occur if an XML request body contains well-formed (i.e., syntactically correct), but semantically erroneous, XML instructions.

来源:https://www.bennadel.com/blog/2434 - http状态码- -无效数据- 400 vs - 422. htm

当客户端请求一些服务器无法处理的荒谬请求时,我建议使用418。比如服务器是一个茶壶,但客户是要求咖啡之类的东西。以下是所有(400-499)客户端错误消息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses

冲突是可以接受的解决办法。

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

The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request. The response body SHOULD include enough information for the user to recognize the source of the conflict. Ideally, the response entity would include enough information for the user or user agent to fix the problem; however, that might not be possible and is not required.

文档继续举了一个例子:

冲突最有可能发生在PUT请求的响应中。例如,如果正在使用版本控制,并且正在PUT的实体包含对资源的更改,这些更改与先前(第三方)请求所做的更改相冲突,服务器可能会使用409响应来表明它无法完成请求。在这种情况下,响应实体可能包含两个版本之间差异的列表,其格式由响应Content-Type定义。


在我的情况下,我想把一个字符串,必须是唯一的,通过API到数据库。在将其添加到数据库之前,我会检查它是否已经在数据库中。

如果是,我将返回“错误:字符串已经在数据库中”,409。

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