【问题标题】:API Development: When to return a BAD REQUEST HTTP Status Code (REST)API 开发:何时返回 BAD REQUEST HTTP 状态代码 (REST)
【发布时间】:2011-11-09 13:19:24
【问题描述】:

我们正在创作 REST 服务,当有人请求具有不存在的父 ID 的资源时该怎么做存在争议。

示例:您正在请求与公司关联的人员列表,因此您 GET 的 ID 为 1,但该公司 ID 不存在。

我认为 REST 的定义表明我们将简单地返回一个空列表(导致 HTTP 204 (No Content)),因为根据规范,HTTP 错误请求仅适用于格式错误的语法:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

由于语法错误,服务器无法理解请求。客户端不应该在没有修改的情况下重复请求。

我认为没有错误要解释也更清楚,您请求的资源不存在。

对最佳实践的想法?

这里有一个 SO 讨论:HTTP 400 (bad request) for logical error, not malformed request syntax 虽然它有点抽象,但如果我应该发布这个,或者只是使用那个问题,我会感到很痛苦。

【问题讨论】:

  • 我尝试了 Jersey (JAX-RS) 默认为空列表。如果您返回一个空列表,您将获得 JSON 格式的空列表以及 204 错误。并不是说这是正确的行为,而是一个数据点。

标签: rest jersey jax-rs http-error


【解决方案1】:

如果你这样做了

GET /company/1

并且不存在 id 为 1 的公司,那么我认为适当的 HTTP 状态代码是 404 - 未找到。

但是,如果你要这样做,

GET /companies?id=1

然后我会返回一个 200 和一个空的公司列表。

【讨论】:

  • 我尝试了 Jersey (JAX-RS) 默认为空列表。如果你返回一个空列表,你会得到 JSON 格式的空列表,但你也会得到 204 错误。不正确,举个例子。同意 404,在严格的 REST 解释中,我认为它也会这样做。
  • 使用 Jersey,如果您请求 GET /companies?id=xyz 其中 id 应该是一个整数,它将给出 404 而不是 400。我不确定那是 Jersey 还是 JAX -RS。在它是 id 的情况下,404 是有意义的,但在具有某种搜索条件的查询参数的常见情况下,您可能想要 400 或简单地不返回任何结果,因为没有这样的 id。只是强调一下,虽然一个好的第一个默认值可能来自规范,但最好的答案取决于上下文。
  • @jhericks 您想提出的观点的一个很好的例子 - 谢谢。赞赏。
【解决方案2】:

204 不是错误代码,它是成功代码,但这是一个小问题。我不经常在空列表中看到它,而是在没有有意义的内容可以响应的成功响应中看到它,例如成功的 DELETE。例如,如果您要返回 JSON,则内容为 [] 的 200 是我对空结果列表的期望。但是,我认为在您的情况下使用它是不正确的。

404 Not Found 是您描述的案例中更常见的错误。你是对的,它不是语法错误,所以 400 是不合适的,但实际上,资源不存在。 404 Not Found 是一个准确的响应。

但在 200、204 和 404 之间进行选择时,正确答案是:视情况而定。问题是它是否是一个错误。 404 更具表现力(客户可以知道没有这样的公司),但您可以用表现力换取安全性,这意味着客户无法判断具有该 ID 的公司是否存在可能是件好事。

【讨论】:

  • 小问题上的公平点,我应该称它为状态代码。鉴于我引用了规范并且它们使用的是相同的(对于代码的一般情况),我在 204 之后删除了错误一词。从技术上讲,你把它叫出来是对的,从技术上讲是这里的游戏名称,所以我改变了它在标题中并将其从 204 参考中删除
【解决方案3】:

缓存呢?只有 200 会被缓存,204 和 404 都不会被缓存。如果这很重要 200 与空列表似乎没问题。不确定空的单个元素怎么办?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多