【问题标题】:REST API: Is it a really bad practice to create custom HTTP response codes?REST API:创建自定义 HTTP 响应代码真的很糟糕吗?
【发布时间】:2014-10-22 04:48:53
【问题描述】:

在编写 RESTful API 以使用自定义 HTTP 响应代码时,这是一种不好的做法,例如:

  • 417 - 未提供密码
  • 418 - 数据库错误

我看到有standard HTTP response codes 的列表。然而,从Twitter's API 来看,Twitter 似乎会在可用时尝试返回标准 HTTP 响应代码,但当他们无法将错误与标准 HTTP 响应对齐时(如果我错了,请纠正我)。

在创建 RESTful API 时,响应代码(尤其是错误)的最佳做法是什么? Twitter 选择使用的实践中的任何 cmets?

【问题讨论】:

  • @Vash 我会认为有你的代表水平的人更好。如果你要修正拼写错误,不要只修正一个缺失的字母。
  • 实际上,我越来越明白还有其他错误也应该修复。另外,请记住,这不是 您的 问题,您只是最初写的。诸如从问题标题中删除“Rest API:”之类的更改是常见的做法,我们对此表示赞赏,我们有一个标签系统,请使用它。
  • 这不是针对您个人的事情,您只需要记住,这是一个社区网站。因此,虽然人们可能认为问题是最好的一种方式,但社区可能更喜欢它提出另一种方式。
  • @Vash-DamianLeszczyński 如果您要解决问题,请正确解决。
  • 请问我们可以在论坛中表现出一些礼仪吗?在查看此问题的早期修订版时,我无法判断 OP 是非母语人士,所以它不会那么糟糕——她的英语比我附近的大多数 yobs 都好。 Ne passe laisser entraîner dans ce, Hellen。

标签: api rest http architecture conceptual


【解决方案1】:

是的,是的,这是不好的做法……主要是。

REST 的一个原则是您使用底层协议,因为 HTTP 已经定义了一组很好的响应代码。

但是,并非所有情况都能完美应对。以 Twitter 的“让你冷静一下”为例,该响应代码在请求有效时使用,由于发出的请求过多,它根本没有被处理。

我没有看到另一个与之完全匹配的响应代码。其他两个选项是要么撒谎,要么告诉用户请求因其他响应而失败,要么给出一个通用的 400“你做了坏事”(然后在正文中给出更详细的解释)。

我倾向于使用通用 X00 代码,并使用标题或正文添加更多关于实际问题的详细信息。这至少更符合标准且不易碎。

但请注意,获取现有错误代码并重新利用它是很糟糕的。 404 应始终仅用于“未找到”错误。不要开始使用它,因为用户无法在一天中的这个时间发出该请求。

【讨论】:

  • 鉴于 Twitter 的 420 '增强你的冷静'的例子,从技术上讲,这可能是 202 “202 响应是故意不承诺的。”,也许是 @ 987654322@ 和Retry-After
  • 429 请求太多
  • @Mark no, 202 暗示请求可能在某个阶段被处理,实际上响应需要说“它永远不会发生”。而 413 是针对“request too large”的,与“too many request”不同。
  • @Cerad 是的,429 似乎是 Twitter 所需的完美响应代码。不确定首先出现的是什么,如果 429 已经被 RFC“标准化”了,那么它应该被清楚地使用,但我认为 Twitter 在此之前使用的是 420。我什至不确定他们是否还在使用 420。
  • @thecoshman 413 说“请求实体大于服务器愿意或能够处理”,它没有说明原因(这很可能是太多的请求),但Retry-after 表示退避,这可能是一种有效的速率限制方式。然而 429 似乎是一个更好的选择(它也定义了Retry-after)。
【解决方案2】:

使用自己的代码的问题是:

  1. 您选择的代码可能会被正式分配给完全不同的东西,这可能会在将来破坏您的 API。 (例如,比较 306 和 301)
  2. 中介不知道你的代码是什么意思,所以不能优化任何东西。互联网之所以运行良好,是因为它是一个分布式系统,而不是端到端系统。
  3. 每个类别都有通用响应,x00,如果没有更好的情况,应该使用它。
  4. 您可以在响应正文或(不太好)响应标头中发送您自己的更具体的错误代码。无需编写自己的代码。如果您确实找到了可以使互联网的其他部分受益的东西,并且到目前为止还没有其他人想到过,您可以随时向 IETF 提交互联网草案(这很容易做到)。

不过,我不会将 Twitter 视为良好互联网实践的光辉典范。 :)

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多