ChatGPT解决这个技术问题 Extra ChatGPT

无效数据的 REST 响应代码

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

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

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

Wikipedia: 412 Precondition Failed : 服务器不满足请求者对请求提出的先决条件之一

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

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

D
Darrel Miller

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

412 - 使用最后修改日期和 ETags 时,前提条件失败用于条件请求。

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 不合适。
C
Community

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

RFC 4918

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


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

如果无法正确解析请求(包括请求实体/正文),则相应的响应为 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 评估为 false。也就是说,客户要求某些东西并提供先决条件,完全清楚这些先决条件可能会失败。 412 绝不应该突然出现在客户端上,并且不应该与请求实体本身相关。


我应该注意更新的 HTTP/1.1 RFC:400 Bad Request、409 Conflict、403 Forbidden 等位于 tools.ietf.org/html/rfc7231 中; 412 Precondition Failed 在 tools.ietf.org/html/rfc7232#section-4.2
C
Community

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

2.3.2 418 I'm a teapot 任何尝试用茶壶冲泡咖啡都会导致错误代码“418 I'm a teapot”。生成的实体主体可能又短又粗。

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


实施它,以便您的 API 为来自您老板的所有请求返回 418 I'm a teapot :)
@vikarjramun 我已经构建了一个虚拟 REST 并在离线时进行了审慎。 (预发布)现在我们的学生正在搜索试图创建有效的数据请求,但这都是茶壶。我是“老板”——但它也有效。
这个 RFC 是愚蠢的。你可以用茶壶煮咖啡,只要你用滤茶器把它倒进杯子里。就像使用散叶茶一样。您也可以毫无问题地在咖啡厅泡茶。
@gburton 不过,这确实需要人工干预。通过网络,您肯定需要一个支持咖啡的设备来制作咖啡。当然,咖啡和茶壶不应该以 418 响应。