【发布时间】:2016-04-14 10:51:12
【问题描述】:
我需要返回有关错误的信息,例如:客户不能有超过 3 个联系人、字段 Job 为空、已超出操作限制。
是否需要使用自己的状态代码发送每个错误?
我可以使用400 BadRequest 来解决所有这些错误吗?
【问题讨论】:
标签: api rest http asp.net-web-api
我需要返回有关错误的信息,例如:客户不能有超过 3 个联系人、字段 Job 为空、已超出操作限制。
是否需要使用自己的状态代码发送每个错误?
我可以使用400 BadRequest 来解决所有这些错误吗?
【问题讨论】:
标签: api rest http asp.net-web-api
我可以对所有这些错误使用 400 BadRequest 吗?
当然。
这曾经有点可疑,因为 RFC 2616 将 400 Bad Request 定义为:
由于格式错误,服务器无法理解请求 句法。客户端不应该重复请求 修改。
但是,通常没有更适用的更好状态,所以它经常被用作最合适的。
随着 RFC 7231 淘汰 RFC 2616 并为 400 提供更广泛的定义,这种情况发生了变化:
400(Bad Request)状态码表示服务器不能或 由于某些被认为是 客户端错误(例如,格式错误的请求语法、无效请求 消息框架或欺骗性请求路由)。
因为“被认为是客户错误的事情”涵盖了许多罪过,所以它现在更明确地适用了。
当然,如果另一个 4xx 代码确实匹配得更好(例如,404 表示与不存在的事物相关的请求[消息中的 ID 未找到匹配项]),那么它是更好的选择。
【讨论】:
不,显然不应该,您应该在浏览器中搜索“HTTP 状态代码列表”。
一个可用的链接是https://en.wikipedia.org/wiki/List_of_HTTP_status_codes。
【讨论】:
我可以对所有这些错误使用 BadRequest (400) 吗?
400 Bad Request 状态码用于指示与请求语法相关的错误。例如。有一个String 类型的字段,并且传递了一个Integer。或者作为String 类型的字段,它接受一组预定义的值(枚举),但传递了另一个字符串。缺少一个字段。字段不能为空。
因此,如果一个字段丢失或为空,这绝对是一个400 Bad Request 错误。
但是,客户的联系人不能超过 3 个,这还不是很清楚。如果您已将正文限制为接受 0-3 范围内的值,则为 400 Bad Request,但如果该字段接受任何整数并且后来证明它不在 0-3 范围内(在实体处理期间),它将是 @ 987654327@(更好的主意)或403 Forbidden(更糟的主意)。
超出了操作限制听起来绝对不像 400 Bad Request 错误。可能是403 Forbidden 或429 Too Many Requests。
看来你不能只用400 Bad Request来处理所有的错误。
重要的是始终在正文中说明问题到底是什么。
顺便说一句:403 Forbidden 用于指示与身份验证或授权不一定相关的禁止操作。
【讨论】:
我可以对所有这些错误使用 BadRequest (400) 吗?
是的,这绝对是此类验证错误的正确状态代码。
【讨论】:
400 Bad Requestlimit of operations was exceeded...