REST响应代码以获取无效数据


272

在以下情况下,应将什么响应代码传递给客户端?

  1. 用户注册时传递的数据无效,例如电子邮件格式错误
  2. 用户名/电子邮件已经存在

我选择了403。我还发现我觉得可以使用。

维基百科:

412先决条件失败:服务器不满足请求者提出的先决条件之一

如果我不使用403,建议输入代码。



我也在解决这个问题。第7章JAX-RS规范的验证(2017)提供了专门针对约束违例的状态代码建议。download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…–
burntsugar

Answers:


298

两种情况下最好的选择是400。如果要进一步澄清错误,可以更改“原因短语”或包含一个正文来解释错误。

412-使用上次修改的日期和ETag时,前提条件失败用于前提条件请求。

403-当服务器希望阻止访问资源时,使用“禁止”。

唯一可能的其他选择是422-无法处理的实体。


10
尽管在这种情况下经常使用它,但是403不限于访问控制,因为rfc2616-10.4.4说:“服务器理解了请求,但拒绝执行它。公开为什么要求没有得到满足,应该说明实体拒绝的原因。” 原因可能是无效数据。但是,422在这里更适用。
Yannick Loiseau

7
我们不要陷入文字批评之中。例如,请参阅trac.tools.ietf.org/wg/httpbis/trac/ticket/294,该文件试图阐明403始终是授权。
fumanchu 2011年

2
@fumanchu不错的收获。指向仅7个小时的变更请求的链接:-)
Darrel Miller

1
@fumanchu表示如果用户无权访问所请求的资源,则应返回403。但是我认为401 Unauthorized更适合访问用户没有权限的资源。
阿米特·帕特尔

1
401未经授权将提示Web浏览器向用户显示标准的HTTP用户名/密码提示。如果您没有为服务使用这种身份验证,或者用户已经具有HTTP身份验证,则401不适用。
格雷格·鲍尔

92

我会推荐422。它不是主要HTTP规范的一部分,但它是由公共标准(WebDAV)定义的,浏览器应将其与其他任何4xx状态代码一样对待。

RFC 4918

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


20
注意,引用的文本指出当请求实体在语法上格式正确,但在语义上错误时,422是适用的。如果请求实体出现乱码,则400为适当的响应。
马蒂·K

87

如果无法正确解析请求(包括请求实体/主体),则相应的响应为400 Bad Request [ 1 ]。

RFC 4918规定,当请求实体在语法上格式正确,但在语义上错误时,422不可处理实体适用。因此,如果请求实体出现乱码(例如错误的电子邮件格式),请使用400;但是如果它没有意义(例如@example.com),请使用422。

如果问题是,如问题中所述,用户名/电子邮件已经存在,则可以使用409 Conflict [ 2 ]以及对冲突的描述以及如何解决的提示(在这种情况下,“选择一个不同的用户名/电子邮件”)。但是,在编写的规范中,尽管有关于HTTP授权的争论,在这种情况下也可以使用403 Forbidden [ 3 ]。

412前提条件失败 [ 4 ]当客户端提供的前提条件请求标头(例如If-Match)评估为false时使用。也就是说,客户请求了一些东西并提供了前提条件,完全知道这些前提条件可能会失败。412绝不应突然出现在客户端上,也不应与请求实体本身相关


1
我应该注意到更新后的HTTP / 1.1 RFC:400错误请求,409冲突,403禁止访问等。位于tools.ietf.org/html/rfc7231中;412失败的前提条件位于tools.ietf.org/html/rfc7232#section-4.2
Matty K

41

返回418 I'm a teapot显然是经过精心设计或恶意并且“不可能发生”的请求,例如CSRF检查失败或缺少请求属性,这很有趣。

2.3.2 418我是茶壶

任何尝试用茶壶冲泡咖啡的操作都将导致错误代码“ 418我是茶壶”。生成的实体主体可能短而结实。

为了使其合理,我将有趣的错误代码的使用限制在未直接暴露给用户的RESTful端点上。


11
实现它,以便您的API返回418 I'm a teapot所有来自老板的请求:)
vikarjramun

2
@vikarjramun我建立了一个虚拟的REST,并离线制作了一个谨慎的REST。(预发行版)现在我们的学生正在搜索尝试创建有效的数据请求,但这全是茶壶。我是“老板”-但它也在工作。
LenglBoy

2
该RFC是愚蠢的。只要您通过滤茶器将咖啡倒入杯中,就可以在茶壶中煮咖啡。就像使用散叶茶一样。您也可以毫无问题地在咖啡厅喝茶。
gburton

2
@gburton但这确实需要人工干预。通过网络,您肯定需要支持咖啡的设备来煮咖啡。当然,咖啡壶和茶壶不应响应418。–
Jasper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.