我有一个JSON请求,我张贴到一个HTTP URL。

如果requestdresource字段存在,但“Roman”是这个字段的无效值,这应该被视为400吗?

[{requestedResource:"Roman"}] 

这应该被视为400的“blah”字段不存在吗?

[{blah:"Roman"}]

当前回答

在我的情况下,这意味着我在json中提供的数据与db所需的数据不兼容,例如电子邮件地址已经添加到db,然后抛出代码400

其他回答

这让我想起了和别人的对话,“我理解-我只是不同意”

400表示服务器没有理解

200表示服务器完全理解并完全处理了请求。

当服务器返回200时,它就在说:“我理解您的请求,我处理了它,没有出现意外错误,这是我的正确响应。”

200表示您可以信任响应中发送的答案。也许答案是“罗马人是不被允许的”——但这仍然是一个正确的答案,没有任何意想不到的问题。

200没有表达关于预期错误或已处理异常的任何信息——因为这不是消息传输过程的一部分。这些是关于HTTP的状态代码,即传输本身的状态。

我认为应该避免模糊“运输/通信”和“处理”之间的界限。

对于那些喜欢用HTTP代码来表示处理中的问题(“我不同意”部分)的人来说,409冲突似乎最适用于“罗马人不允许”。 RFC 7231 409冲突

冲突在很大程度上意味着“缺乏一致”,对吧?

无论您选择什么HTTP响应代码,似乎每个人都同意您的响应应该解释为什么失败,以及如何解决它。在罗曼的情况下,可能返回字段可接受的值列表?

从w3.org

10.4.1 400个错误请求 由于格式错误,服务器无法理解请求 语法。客户端不应该重复请求 修改。

选择HTTP响应代码是一项相当简单的任务,可以用简单的规则来描述。唯一经常被遗忘的棘手部分是RFC 7231的第6.5段:

除响应HEAD请求外,服务器应该发送一个 包含错误情况解释的陈述, 这是暂时的还是永久的。

规则如下:

If request was successful, then return 2xx code (3xx for redirect). If there was an internal logic error on a server, then return 5xx. If there is anything wrong in client request, then return 4xx code. Look through available response code from selected category. If one of them has a name which matches well to your situation, you can use it. Otherwise just fallback to x00 code (200, 400, 500). If you doubt, fallback to x00 code. Return error description in response body. For 4xx codes it must contain enough information for client developer to understand the reason and fix the client. For 5xx because of security reasons no details must be revealed. If client needs to distinguish different errors and have different reaction depending on it, define a machine readable and extendible error format and use it everywhere in your API. It is good practice to make that from very beginning. Keep in mind that client developer may do strange things and try to parse strings which you return as human readable description. And by changing the strings you will break such badly written clients. So always provide machine readable description and try to avoid reporting additional information in text.

所以在你的情况下,我返回400错误和类似的东西,如果“罗曼”是从用户输入和客户端必须有特定的反应:

{
    "error_type" : "unsupported_resource",
    "error_description" : "\"Roman\" is not supported"
}

或者更一般的错误,如果这种情况是客户端的一个糟糕的逻辑错误,除非开发人员犯了错误:

{
    "error_type" : "malformed_json",
    "error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}

在我的情况下,这意味着我在json中提供的数据与db所需的数据不兼容,例如电子邮件地址已经添加到db,然后抛出代码400

想想期望。

作为客户端应用程序,您希望知道服务器端是否出现了问题。如果服务器需要在blah缺失或requestedResource值不正确时抛出错误,那么400错误将是合适的。