我应该使用HTTP 4XX来表示HTML表单的错误?(Should I use HTTP 4xx t

2019-07-22 19:52发布

我只花了20分钟的调试一些(Django的)单元测试。 我在测试一个浏览后,我期待一个302返回码,之后我认定了一堆被预期数据库实体。 原来最近提交合并增加了一种新形式的领域,我的测试失败,因为我并没有包括正确的表单数据。

问题是,该测试失败,因为HTTP返回码为200,而不是302,我只能通过打印响应HTTP,并通过它寻找工作出了问题。 除了有看通过HTML工作出了问题的刺激,200似乎是为没有得到处理的POST错误的代码。 出现4xx(客户端错误)似乎更合适。 此外,它会使调试测试不在话下,作为响应代码会指着我直的问题。

我读过关于使用422(无法处理的实体)的REST API的内可能返回代码,但无法找到HTML视图/处理程序中使用它的任何证据。

我的问题是 - 任何人这样做,如果没有,为什么不呢?

[UPDATE 1]

只是为了澄清,这个问题涉及到HTML表单,而不是一个API。

这也是一个关于HTTP响应代码本身的问题 - 没有Django的。 这恰好是我使用的是什么。 我已经删除了Django的标签。

[UPDATE 2]

一些进一步的澄清,与W3C引用( http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ):

10.2成功2XX

这个类的状态代码表示客户端的请求被成功接收,理解和接受。

10.4客户端错误4XX

该4XX类的状态代码是用于在客户端似乎有错误的案件。

10.4.1 400错误的请求

请求不能被服务器因为语法错误的理解。

而从https://tools.ietf.org/html/rfc4918#page-78

11.2。 422无法处理的实体

的422(无法处理的实体)状态代码表示的服务器理解的内容类型的请求实体(因此一个415(不支持的媒体类型)状态代码是不适当的),并且所述请求实体的语法是正确的(因此400(错误的请求)状态码是不合适的),但无法处理所包含的指令。 例如,如果XML请求主体包含合式(即语法正确),可能会发生这种错误情况,但语义错误,XML指令。

[UPDATE 3]

在将其挖掘,422是一个WebDAV扩展[1],这可以解释它的模糊。 这就是说,由于Twitter的使用420为自己的目的,我想我就不管我想要的。 但它会以4开头。

[UPDATE 4]

在使用定制响应代码,以及应如何被处理(如果未识别)指出,从HTTP 1.1规范( http://tools.ietf.org/html/rfc2616#section-6.1.1 ):

HTTP状态代码是可扩展的。 HTTP应用不要求了解全部注册的状态代码的含义,尽管这种理解显然是不可取的。 然而,应用程序必须理解类的任何状态代码,由第一个数字指示,并当作是等同于类的X00状态代码,不同的是一个无法识别的反应绝不能缓存无法识别的响应。 例如,如果客户端收到的431无法识别的状态码,它可以安全地假设有一些错误的请求和处理响应,如果它已经收到了400个状态码。 在这种情况下,用户代理应当呈现给实体与所述响应中返回的用户,因为该实体可能包括人可读的信息,这将解释异常状态。

[1] https://tools.ietf.org/html/rfc4918

Answer 1:

你是正确的,200是错的,如果结果并不成功。

我还认为,一个成功的,具有重定向到结果页应该是303,而不是302。

4XX是客户端错误是正确的。 422似乎是我的权利。 在任何情况下,不要不通过IANA注册它们创造新的4xx代码。



Answer 2:

似乎没有成为一个公认的答案,这是诚实的,是有点出人意料。 表单验证是Web开发的这样一个基石是事实,没有任何反应代码来说明验证失败似乎是一个错失的机会。 特别是考虑到自动化测试的增殖。 它似乎并不实际测试通过检查错误消息的HTML内容,而不仅仅是测试响应代码的响应。

我坚持我的说法在疑问,200是失败的业务规则的请求的错误响应代码 - 而302也不合适。 (如果表单验证失败,那么它不应该更新了服务器上的任何状态,因此幂等,并没有必要使用PRG模式,以防止用户重新提交表单,让他们)。

所以,因为没有一个“批准”的方法,我目前正在测试(直译)与我自己 - 421.如果我们碰上使用非标准的HTTP状态代码的任何问题,我会汇报。

如果没有更新这个答案,那么我们就用它在生产,它的工作原理,你可以这样做。



Answer 3:

很明显,某种形式的POST请求应导致4XX HTTP错误(例如错误的URL,缺乏预期的领域,无法发送AUTH的cookie),但错误输入密码或无意忽略必填字段非常普遍,预计在应用程序中出现。

它似乎并不清楚,每一个表格失效问题必须构成一个HTTP错误的任何规范。

我想我的直觉是,如果一个服务器发送客户端的形式,并在客户端及时与正确形成的POST请求到形式都有望领域回复,一个共同的业务逻辑冲突不应该是一个HTTP错误。

如果一个客户端脚本使用HTTP作为传输机制的情况似乎就更少了定义。 例如,如果一个JSON-RPC请求发送形式的详情,服务器端函数调用成功和响应返回给调用者,似乎是一个200次的成功。

有传言称:有不好的凭据登录在得到来自Facebook,谷歌,维基百科和200,并从亚马逊204。

理想地,将IETF与RFC清除此起来,也许增加对HTTP错误代码“未执行的操作由于形式无效故障”或膨胀的422定义以覆盖这一点。



Answer 4:

该POST返回200,如果你不重定向。 302未在POST请求后标头自动送出,所以你要发送的报头( https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse手动)和代码不中继上的形式的数据。

重定向回的形式(或其他)与代码302的理由是禁止浏览器数据重复发送的刷新或历史浏览。



文章来源: Should I use HTTP 4xx to indicate HTML form errors?
标签: http