【发布时间】:2013-03-12 22:29:10
【问题描述】:
我只花了 20 分钟调试一些 (django) 单元测试。我正在测试一个视图 POST,我期待一个 302 返回码,之后我断言一堆数据库实体符合预期。结果是最近合并的提交添加了一个新的表单字段,我的测试失败了,因为我没有包含正确的表单数据。
问题在于测试失败,因为 HTTP 返回码是 200,而不是 302,我只能通过打印出响应 HTTP 并查看它来解决问题。除了必须通过 HTML 来解决问题的烦恼之外,对于未处理的 POST,200 似乎是错误的代码。 4xx(客户端错误)似乎更合适。此外,它会使调试测试变得轻而易举,因为响应代码会直接指出问题所在。
我已阅读有关在 REST API 中使用 422(不可处理实体)作为可能的返回代码的信息,但找不到任何证据表明在 HTML 视图/处理程序中使用它。
我的问题是 - 是否还有其他人这样做,如果没有,为什么不这样做?
[更新 1]
澄清一下,这个问题与 HTML 表单有关,而不是 API。
这也是关于 HTTP 响应代码本身的问题 - 而不是 Django。这恰好是我正在使用的。我已经删除了 django 标签。
[更新 2]
进一步澄清,W3C 参考资料 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):
10.2 成功 2xx
此类状态码表示客户端的请求被成功接收、理解和接受。
10.4 客户端错误 4xx
4xx 类状态码适用于客户端似乎出错的情况。
10.4.1 400 错误请求
由于语法错误,服务器无法理解请求。
来自https://www.rfc-editor.org/rfc/rfc4918#page-78
11.2. 422 无法处理的实体
422 (Unprocessable Entity) 状态码表示服务器 理解请求实体的内容类型(因此 415(不支持的媒体类型)状态码不合适),并且 请求实体的语法是正确的(因此是 400 (Bad Request) 状态码不合适)但无法处理包含的 指示。例如,如果 XML 请求正文包含格式正确(即语法正确),但是 语义错误的 XML 指令。
[更新 3]
深入研究,422 是一个 WebDAV 扩展[1],这可能解释了它的晦涩难懂。也就是说,由于 Twitter 将 420 用于他们自己的目的,我想我会随心所欲。但它会以 4 开头。
[更新 4]
HTTP 1.1 规范 (https://www.rfc-editor.org/rfc/rfc2616#section-6.1.1) 中关于自定义响应代码的使用以及应如何处理(如果无法识别)的说明:
HTTP 状态码是可扩展的。不需要 HTTP 应用程序 了解所有注册状态代码的含义,尽管这样 理解显然是可取的。但是,应用程序必须 了解任何状态代码的类别,如第一个所示 数字,并将任何无法识别的响应视为等效于 该类的 x00 状态代码,除了 不得缓存无法识别的响应。例如,如果一个 客户端收到无法识别的状态码431,可以 安全地假设它的请求有问题,并且 将响应视为已收到 400 状态代码。在这样的 在这种情况下,用户代理应该向用户呈现返回的实体 响应,因为该实体很可能包括人类- 解释异常状态的可读信息。
【问题讨论】:
-
这完全取决于您决定如何设计您的 API。我不确定 422 是否是最佳响应代码,但可以肯定的是,您可以发送 4xx 范围内的 200 以外的其他内容。
-
@MattBall 出于兴趣-您为什么不认为这是最好的代码? (我也没有答案——但以 4 开头的东西感觉比 2 好)?
-
不是直接回答你的问题,而是stackoverflow.com/q/1959947/139010。
-
是的 - 看到那个 - 但不幸的是我不同意接受的答案;-)(请参阅上面问题的更新)。
-
仅供参考 - RFC2616 已被 RFC7230(和朋友)取代,因此最好参考它们。请参阅 httpwg.org/specs>。此外,虽然 Twitter 最初确实使用 420,但在定义后,他们转向了标准 429。
标签: http