在以下情况下,应向客户端传递什么响应代码?
- 用户注册时传递的数据无效,比如错误的电子邮件格式
- 用户名/电子邮件已存在
我选择了403。我还发现下面的内容,我认为也可以使用。
维基百科:
412 Precondition Failed : 服务器未满足请求者对请求的其中一个前提条件
如果我应该使用403以外的代码,请提供建议。
在以下情况下,应向客户端传递什么响应代码?
我选择了403。我还发现下面的内容,我认为也可以使用。
维基百科:
412 Precondition Failed : 服务器未满足请求者对请求的其中一个前提条件
如果我应该使用403以外的代码,请提供建议。
400 在这两种情况下都是最好的选择。如果您想进一步澄清错误,可以更改原因短语或包含一个正文来解释错误。
412 - 先决条件失败是在使用最后修改日期和ETags进行有条件请求时使用的。
403 - 禁止访问是当服务器希望防止访问资源时使用的。
唯一可能的其他选择是 422 - 无法处理的实体。
我建议使用422状态码。虽然它不是主要HTTP规范的一部分,但它是由公共标准(WebDAV)定义的,并且浏览器应该将其视为任何其他4xx状态码。
从RFC 4918中得知:
422(无法处理的实体)状态码意味着服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态码不合适),请求实体的语法正确(因此400(错误的请求)状态码不合适),但无法处理包含的指令。例如,如果XML请求正文包含形式良好(即语法上正确),但语义上有误的XML指令,则可能出现此错误条件。
422
,并且它已经独立于WebDAV。 - Stijn de Witt400 Bad Request
是指服务器无法解析请求时使用的状态码。虽然422最初是为WebDAV定义的,但它是4xx范围内最合适的响应代码,并且已经被许多API和框架用于验证错误,因此已成为标准。 - Stijn de Witt如果请求无法正确解析(包括请求实体/正文),则适当的响应是400 Bad Request [1]。
RFC 4918指出,当请求实体在语法上格式正确但在语义上存在错误时,应使用422 Unprocessable Entity。因此,如果请求实体是乱码的(如坏电子邮件格式),请使用400;但如果它根本没有意义(如@example.com
),请使用422。
如果问题是,如问题描述所述,用户名/电子邮件已经存在,则可以使用409 Conflict [2]并提供冲突描述和如何解决它的提示(在这种情况下,“选择不同的用户名/电子邮件”)。然而,在规范中写道,在HTTP授权方面的争论不考虑的情况下,也可以在此情况下使用403 Forbidden [3]。
当由客户端提供的先决条件请求标头(例如If-Match
)计算为false时,使用412 Precondition Failed [4]。也就是说,客户端请求并提供了先决条件,完全知道这些先决条件可能会失败。412不应该突如其来地对客户端造成影响,并且不应与请求实体本身有关。
409 Conflict
的意思。它非常明确地涉及写入冲突。因此,如果您的数据库事务失败,因为您尝试写入的记录在您读取和更改记录以及您编写它之间被另一个用户修改,那么这正是409
的用途。考虑乐观锁等。它不适用于验证错误。在OP描述的两种情况下,422
是最佳选择。 - Stijn de Witt400 Bad Request
只有在JSON或XML格式不正确时才会使用,而不是在其中任何嵌入的数据出错时使用。基本上,当你编写一个服务器时,你要做一些像这样的事情try {const json = JSON.parse(request.body); if (! isValid(json)) { response.status = 422 } else { response.status = 200 } } catch (e) { response.status = 400}
。 - Stijn de Witt回应那些明显是恶意或“不可能发生”的请求,例如未通过CSRF检查或缺少请求属性等,返回418我是茶壶
状态码是很有趣的。
2.3.2 418我是茶壶
使用茶壶煮咖啡的任何尝试都应该导致错误代码“418我是茶壶”。结果实体主体可以简短而粗壮。
为了保持足够的严肃性,我限制有趣错误代码的使用仅适用于不直接向用户公开的RESTful端点。