【问题标题】:HTTP status code for "no data available" from an external datasource来自外部数据源的“无可用数据”的 HTTP 状态代码
【发布时间】:2012-03-07 02:51:01
【问题描述】:

场景:

发送POST 请求以处理将导致从外部数据源检索数据的订单。

有三种可能的结果:

  1. 数据源为请求返回数据
  2. 没有可用于请求的数据(这被视为错误)
  3. 无法访问数据源(可能因维护而停机)

1 的明显响应是 200: OK 或 201: Created(根据此请求创建实体)。

2 和 3 适合哪些状态代码?

我考虑过的状态码:

  • 503: Service Unavailable 当数据源关闭时
  • 500: Internal Server Error 当数据源关闭时
  • 502: Bad Gateway 当“没有可用数据”时
  • 404: Not Found 当“没有可用数据”时
  • 403: Forbidden 当“没有可用数据”时
  • 412: Precondition Failed 当“没有可用数据”时

【问题讨论】:

  • 您是否尝试使用 POST 请求查询数据?你不应该是使用 GET 方法吗?
  • GET 不合适,因为这些数据查询既不安全也不幂等(它们可能会导致货币交换等)。
  • 对于2.,我会分成多个案例。如果没有给出发布数据,我们应该抛出一个400 Bad Request。如果未设置必填字段但其他数据正确,则引发412 Precondition Failed。

标签: http rest http-status-codes


【解决方案1】:

2) 回顾这一点,我同意它可能应该是 204 No Content 或者可能是 200,其正文表明根据返回的结构找不到任何记录或资源。 404 通常用于资源 URI 不存在或 URI 中的资源在 restful 服务的情况下找不到。

3) 503 服务不可用

由于服务器临时过载或维护,服务器当前无法处理请求。这意味着这是一种暂时的情况,经过一段时间的延迟会得到缓解。如果已知,延迟的长度可以在 Retry-After 标头中指示。如果没有给出 Retry-After,客户端应该像处理 500 响应一样处理响应。

  Note: The existence of the 503 status code does not imply that a
  server must use it when becoming overloaded. Some servers may wish
  to simply refuse the connection.

【讨论】:

  • 如果服务器在此资源上接受了请求,但没有可返回的数据 - 那么 404 就没有意义了。不幸的是,我认为这里没有明确的状态代码是有意义的,但我倾向于更倾向于 204 的答案(或者甚至可能是 200,其正文显示“数据不可用”)。跨度>
  • 204如果认为http请求失败,肯定是错误的。
  • 取决于“认为失败”的含义,如果您正在搜索某些内容并且没有返回任何结果,则 204 可能是可以接受的。 OP 确实没有提供足够的细节来给出明确的答案。我们真正要做的就是“没有可用于请求的数据”联系数据源的问题是单独处理的,所以真正剩下的就是有人正在请求不存在的数据,即看起来并不像一个错误条件,所以 2xx 范围似乎是合理的。
  • 200 带有返回消息也有意义,否则 400 也适用,认为它是一个错误的请求
【解决方案2】:

3) 对此我同意 503

2) 坦率地说,我认为在案例 2 中使用 204 是一个很好的论据。您可以在标题中包含元信息以明确指出“出了什么问题”。这实际上取决于您在多大程度上认为这种情况是 API 级别的“错误”。

如果 API 本身按预期运行,并且请求是由经过身份验证和授权的用户向有效端点发出的,并且没有导致服务器出现故障,那么 400 或 500 系列错误中似乎很少有申请。

例如,404 通常意味着您调用的 URI 不存在,如果确实存在,那么使用该代码至少会误导 IMHO

**10.2.5 204 No Content**

服务器已完成请求,但不需要返回 实体主体,并且可能想要返回更新的元信息。这 响应可能包括新的或更新的元信息,形式为 entity-headers,如果存在应该与 请求的变体。

如果客户端是一个用户代理,它不应该改变它的文档视图 从导致发送请求的原因。这个回应是 主要目的是允许输入进行操作,而无需 导致用户代理的活动文档视图发生变化,尽管 任何新的或更新的元信息都应该应用于文档 当前在用户代理的活动视图中。

204 响应不能包含消息体,因此总是 由标题字段后的第一个空行终止。

【讨论】:

  • 另一种“流行”的处理方式似乎是返回错误消息或带有 200 HTTP 状态代码的空响应。 stackoverflow.com/questions/11402156/… 也谈到了这一点
  • 如果 服务器 处理请求时没有发生错误,我会避免返回 5xx 状态码(即一切正常,除了没有可用的数据)。在所描述的场景中,服务器没有问题,而是客户端请求了它不应该拥有的东西。所以我建议使用 4xx 状态码,例如 400、404 或 406。
  • 问题中描述的场景 3“数据源不可用”似乎是一种实际情况,其中出现了“错误”503,但正如我所说,不适用于系统正在运行的场景 2但系统中不存在数据
【解决方案3】:

HTTP 404 - 带有您自己的错误消息,例如“未找到数据”。

Twitter 使用 404。 参考:https://developer.twitter.com/en/docs/basics/response-codes.html

【讨论】:

【解决方案4】:
  1. 数据源为请求返回数据
200: OK/201: CREATED
Because everything is working as expected
  1. 没有可用于请求的数据(这被视为错误)
400: BAD REQUEST
The request was invalid or cannot be otherwise served. An accompanying error message will explain further inside the body.like:
HTTP 400
{
response: null,
code: "USER_101", //should be used customized error codes here
error: "User details not found"
}
  1. 无法访问数据源(可能因维护而停机)
404: Resource/URI NOT FOUND
The URI requested or resource is invalid
Like: https://www.lipsum.com/list-page
**/list-page** is not defined/found

在此处查找最常用的状态代码:

200 - 好的 一切正常,已获取资源并在消息正文中传输。 201 – 已创建 已创建新资源 204 – 无内容 资源已成功删除,没有响应正文 304 - 未修改 这用于缓存目的。它告诉客户端响应没有被修改,因此客户端可以继续使用相同的缓存版本的响应。 400 – 错误请求 请求无效或无法提供服务。确切的错误应在错误有效负载中解释。 401 - 未经授权 该请求需要用户身份验证。 403 - 禁止 服务器理解请求但拒绝它或不允许访问。 404 - 未找到 URI 后面没有资源。 500 – 内部服务器错误 API 如果全局 catch 博客中发生错误,则应记录堆栈跟踪而不作为响应返回。

【讨论】:

    【解决方案5】:

    在我看来,处理此问题的最佳方法是使用 200 无结果对象。

    为什么?

    您有一个响应,您可以轻松地做某事。我进行了搜索,一切正常,但数据库中没有任何内容可以给出结果。因此,result = null 和一条消息解释了这一点。如果在网络调用中发现此内容,则不是安全风险。

    如果您担心安全风险,那么 204 可能是最好的方法。

    res.status(200).send({
       result: null,
       message: 'No result'
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多