【问题标题】:Can I use custom reasons for an HTTP status code to differentiated between errors for a REST API我可以使用 HTTP 状态代码的自定义原因来区分 REST API 的错误吗
【发布时间】:2011-06-03 13:29:57
【问题描述】:

我想区分不同类型的“未找到”错误。例如给出以下请求:

GET /author/Adams/works/HHGTTG

作者可能是“找不到”或作品可能是“找不到”,我想区分这两者。

状态:404 - 找不到作者
状态:404 - 未找到工作

根据规范,可以更改原因短语。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

6.1.1 状态码和原因短语

...这里列出的原因短语只是建议——它们可以被本地等效替换而不影响协议...

是否也可以为同一个状态代码使用两个唯一的短语?

而且,这是一种合理的方法还是有更好的约定来指示更细粒度的错误?

最终,我希望有一个客户端库可以抛出 AuthorNotFound 或 WorkNotFound 异常,而不是一般的 AuthorOrWorkNotFound 异常。

【问题讨论】:

    标签: http rest http-status-codes


    【解决方案1】:

    您可以让 HTTP 响应的正文包含一条消息,您可以使用任何附加信息对其进行解析。

    状态码上的 HTTP 状态消息(在响应中)可以是您想要的任何内容,并且不会影响任何客户端。 HTTP 客户端通常会忽略消息文本。

    【讨论】:

      【解决方案2】:

      当使用“未找到”的“阴影”方法时,您可以将 404 与响应正文一起使用:

      • 使用带有文本详细信息的 404 状态(“未找到作者”、“未找到作品”)。为了使语言更加灵活,您可以使用标签(例如 error.author.notFound)
      • 使用更结构化和更容易解析“子代码”(例如,10 代表未找到作者,11 代表未找到用户)。

      我仍然不推荐上面提到的子代码,它们为统一的 HTTP 接口增加了很多复杂性和维护工作。以不同的方式构建您的 api-client 库。让它先调用/author/adams/work/11。如果它返回 404,则调用/author/adams/ next 以查明是否是丢失的作者导致了 404。然后您可以抛出相应的 NotFound 异常。

      另一种选择是以不同的方式设计最终的 api-client 应用程序。它首先应该调用/author/adams,然后如果不是404 将继续/author/adams/work。因此,应用程序本身自然而然地走下坡路。但这当然只有在前端内的页面流适应此调用顺序时才有效。

      【讨论】:

      • 这让我开始思考,为了我的使用,将未找到的 404 翻译成一个是合法的
      • [previous comment got mangled] 这让我想到,对于我的用例,将 404 not found 转换为 WorkNotFound 是合法的,即使真正的原因是因为没有作者。如果我请求 /author/adams/ 并得到一个始终转换为 WorkNotFound 的 404,而 /author/adams/work/HHGTTG 的 404 将始终将 404 转换为 WorkNotFound。客户端我可以通过直接查找作者轻松确定WorkNotFound的根本原因是否是AuthorNotFound。感谢您提供有用的提示。
      猜你喜欢
      • 2011-12-21
      • 2022-11-03
      • 2016-04-14
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2023-03-21
      相关资源
      最近更新 更多