我刚花了20分钟来调试一些(django)单元测试。我正在测试一个视图POST,期望得到302返回代码,之后我断言许多数据库实体与预期相同。结果最近合并的提交添加了一个新的表单字段,我的测试失败了,因为我没有包含正确的表单数据。
问题在于测试失败,因为HTTP返回代码是200,而不是302,我只能通过打印响应HTTP并查看其中的内容来解决问题。除了必须查看HTML以解决问题的烦恼外,200似乎对于未被处理的POST来说是错误的代码。4xx(客户端错误)似乎更合适。此外,如果使用422(无法处理的实体)作为REST API中可能的返回代码,将会使测试调试变得轻松,因为响应代码将直接指向问题。
我已经阅读过在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 Bad Request
由于格式不正确,服务器无法理解该请求。
HTTP状态码是可扩展的。HTTP应用程序不需要理解所有注册状态码的含义,尽管这样的理解显然是可取的。但是,应用程序必须理解任何状态码的类别,如第一个数字所示,并将任何无法识别的响应视为该类别的x00状态码的等效项,但未识别的响应不能被缓存。例如,如果客户端收到了431的无法识别的状态码,则可以安全地假设其请求存在问题,并将响应视为收到了400状态码。在这种情况下,用户代理应向用户呈现随响应返回的实体,因为该实体很可能包含人类可读的信息,可以解释异常的状态。
[1] {{链接1:https://www.rfc-editor.org/rfc/rfc4918}}
问题在于测试失败,因为HTTP返回代码是200,而不是302,我只能通过打印响应HTTP并查看其中的内容来解决问题。除了必须查看HTML以解决问题的烦恼外,200似乎对于未被处理的POST来说是错误的代码。4xx(客户端错误)似乎更合适。此外,如果使用422(无法处理的实体)作为REST API中可能的返回代码,将会使测试调试变得轻松,因为响应代码将直接指向问题。
我已经阅读过在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 Bad Request
由于格式不正确,服务器无法理解该请求。
从https://www.rfc-editor.org/rfc/rfc4918#page-78中得知:
11.2. 422无法处理的实体
422无法处理的实体状态码表示服务器理解了请求实体的内容类型(因此不适用415(不支持的媒体类型)状态码),并且请求实体的语法正确(因此不适用400(错误请求)状态码),但是无法处理包含的指令。例如,如果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状态码。在这种情况下,用户代理应向用户呈现随响应返回的实体,因为该实体很可能包含人类可读的信息,可以解释异常的状态。
[1] https://www.rfc-editor.org/rfc/rfc4918
[1] {{链接1:https://www.rfc-editor.org/rfc/rfc4918}}