return 对于 POST 到资源 URI 的什么 HTTP 代码取决于另一个相关 object 的响应能力或可访问性?

What HTTP code to return for a POST to a resource URI which depends on the responsiveness or accessibility of another related object?

我正在对资源 URI 执行 POST。但此操作的成功取决于另一个相关 object 的响应能力或可访问性。如果 object 没有响应或无法访问,则操作需要 return 失败。在这种情况下我应该选择什么 HTTP 代码?

我目前正在针对以下代码集思广益,但未能找到合适的代码:

  1. 404 NOT FOUND - 这表示资源 URI 的 "not found",而不是相关的不可访问实体。
  2. 412 前提条件失败 - 仅适用于有一个或多个 header 字段指示前提条件的条件请求 - 我不需要提供任何。

我无法找到特定的 HTTP 代码或将其归零。

选择正确的状态代码总是很棘手。例如,如果您 return 一个状态代码,如 404,调试可能会出轨,因为有人可能不确定这是因为 URL 实际上不存在,还是因为内部的其他原因。

通常来电者只需要知道一些事情:

  • 端点是否存在?如果没有,404 NOT FOUND
  • 我的请求格式是否正确并且通过了验证?如果不是,400 BAD REQUEST
  • 我的请求是否因为身份验证不正确而被拒绝?如果不是,401 或 403 取决于上下文(有细微差别)
  • 我的请求是否因为我无法控制的事情而失败?如果是这样,500 内部错误

通常我会尝试将响应与服务逻辑分开。如果您想更具体地说明到底发生了什么(在您的示例中,依赖项没有响应),returning 一些 JSON 更详细地描述了问题所在将是比使用 http 状态代码描述服务端的特定错误更合适的地方。

所以你的情况,我觉得500是最合适的。调用方只知道出了点问题,对此它无能为力,并且它可以根据需要处理该情况。如果来电者需要了解更多发生的事情,请使用 JSON 响应来传达这一点。

让我们检查候选人:

404:总是一个选项,但由于相同的请求有时会失败或成功,这会产生闪烁的行为,这不是客户在获得 404 时所期望的。

412:RFC 2616 说:"The precondition given in one or more of the request-header fields" - 这不是失败的原因。

417:类似于412:"The expectation given in an Expect request-header field could not be met by this server"

503: "The server is currently unable to handle the request due to a temporary overloading or maintenance of the server."

似乎没有什么是完美的,但我会选择503,因为它最能代表临时问题并引导客户重试。

HTTP 状态代码列表

  • 1xx 信息性
  • 2xx 成功
  • 3xx 重定向
  • 4xx 客户端错误
  • 5xx 服务器错误

参考 wiki :

103个检查点

Used in the resumable requests proposal to resume aborted PUT or POST requests.

420 方法失败(Spring 框架)

A deprecated response used by the Spring Framework when a method has failed. 420 Enhance Your Calm (Twitter) Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead.

450 被 Windows 家长控制 (Microsoft) 阻止

A Microsoft extension. This error is given when Windows Parental Controls are turned on and are blocking access to the given webpage.

498 无效令牌 (Esri)

Returned by ArcGIS for Server. A code of 498 indicates an expired or otherwise invalid token.

需要 499 个令牌 (Esri)

Returned by ArcGIS for Server. A code of 499 indicates that a token is required but was not submitted.

499 请求已被杀毒软件禁止

Produced by some programs such as Wget when a malicious site is intercepted.

509 超出带宽限制(Apache Web Server/cPanel)

The server has exceeded the bandwidth specified by the server administrator; > this is often used by shared hosting providers to limit the bandwidth of customers.

530 站点被冻结

Used by the Pantheon web platform to indicate a site that has been frozen due to inactivity.

https://greenbytes.de/tech/webdav/rfc7231.html#status.409:

"6.5.8 409 冲突

409(冲突)状态代码表示由于与目标资源的当前状态发生冲突,请求无法完成。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个负载,其中包含足够的信息供用户识别冲突的来源。"