【问题标题】:REST response code for invalid data无效数据的 REST 响应代码
【发布时间】:2011-09-01 16:17:55
【问题描述】:

如果出现以下情况,应该将什么响应代码传递给客户端?

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

我选择了403。我也发现了以下我觉得可以使用的。

维基百科:

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

如果我应该使用 403 以外的代码,请建议代码。

【问题讨论】:

标签: http rest jax-rs


【解决方案1】:

400 在这两种情况下都是最佳选择。如果您想进一步澄清错误,您可以更改原因短语或添加正文来解释错误。

412 - Precondition failed 用于在使用最后修改日期和 ETag 时的条件请求。

403 - 当服务器希望阻止对资源的访问时使用 Forbidden。

唯一可能的其他选择是 422 - Unprocessable entity。

【讨论】:

  • 虽然它经常在这种情况下使用,但 403 并不限于访问控制,因为 rfc2616-10.4.4 说:“服务器理解请求,但拒绝执行它。[.. .] 如果服务器希望公开请求未完成的原因,它应该描述实体拒绝的原因。”原因可能是无效数据。但是,422 在这里更适用。
  • 我们不要陷入文本批评。例如,参见trac.tools.ietf.org/wg/httpbis/trac/ticket/294,它试图澄清 403 是并且始终是关于授权的。
  • @fumanchu 不错。仅 7 小时前的更改请求的链接 :-)
  • @fumanchu 这意味着如果用户无权访问请求的资源,则应返回 403。但我认为 401 Unauthorized 更适合访问用户没有权限的资源。
  • 401 Unauthorized 将提示 Web 浏览器向用户显示标准 HTTP 用户名/密码提示。如果您没有为您的服务使用这种身份验证,或者如果用户已经拥有 HTTP 身份验证,则 401 不合适。
【解决方案2】:

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

来自RFC 4918

422(Unprocessable Entity)状态码表示服务器理解请求实体的内容类型(因此 415(Unsupported Media Type)状态码是不合适的),并且请求实体的语法是正确的(因此 400 (错误请求)状态代码不合适)但无法处理包含的指令。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会发生这种错误情况。

【讨论】:

  • 请注意,引用的文本指出 422 适用于请求实体在语法上格式正确但在语义上错误的情况。如果请求实体出现乱码,则 400 是适当的响应。
【解决方案3】:

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

RFC 4918 声明 422 Unprocessable Entity 适用于请求实体在语法上格式良好但在语义上错误的情况。因此,如果请求实体出现乱码(例如错误的电子邮件格式),请使用 400;但如果它没有意义(比如@example.com),请使用 422。

如果问题是,如问题中所述,用户名/电子邮件已经存在,您可以使用 409 Conflict [2] 说明冲突,并提示有关如何修复它(在这种情况下,“选择不同的用户名/电子邮件”)。然而,在编写的规范中,403 Forbidden [3] 也可以在这种情况下使用,尽管有关于 HTTP 授权的参数。

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

【讨论】:

【解决方案4】:

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

2.3.2 418 我是个茶壶

任何尝试用茶壶冲泡咖啡都会导致错误 代码“418我是一个茶壶”。生成的实体主体可能很短并且 粗壮。

为了保持合理的严肃性,我将有趣的错误代码的使用限制在不直接暴露给用户的 RESTful 端点。

【讨论】:

  • 实现它,以便您的 API 为来自您老板的所有请求返回 418 I'm a teapot :)
  • @vikarjramun 我已经构建了一个虚拟 REST 并在离线时进行了审慎。 (预发布)现在我们的学生正在搜索试图创建有效的数据请求,但这都是茶壶。我是“老板”——但它也很管用。
  • 这个 RFC 是愚蠢的。你可以在茶壶里煮咖啡,只要你用滤茶器把它倒进杯子里。就像使用散叶茶一样。您也可以毫无问题地在咖啡厅泡茶。
  • @gburton 不过,这确实需要人工干预。通过网络,你肯定需要一个能喝咖啡的设备来煮咖啡。当然,咖啡和茶壶不应该用 418 响应。
猜你喜欢
  • 2017-12-20
  • 2013-06-20
  • 2014-02-10
  • 2017-06-24
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多