当请求时间过长时使用哪个 HTTP 响应代码?
Which HTTP response code to use when the request takes too long?
我正在构建一个 API 对我们存储的非常大的数据库进行分析。有些请求需要很长时间才能处理。我们想主动中止花费超过 10 分钟的请求,但在我们尝试之前,我们不知道请求是否会花费那么长时间。大多数时候,这不是因为暂时的服务器超载。就是用户提出的请求涉及的数据太多,我们根本无法足够快地完成它。
我已经搜索了 list of standard HTTP response codes,但我找不到非常合适的:
409 Conflict
- 也许吧?用户可以更改他们的请求以涉及更小的数据集。但我们觉得这更像是服务器问题,而不是客户端问题。
422 Unprocessable Entity
- 也许吧?我们将其用于其他验证错误,例如错误的日期格式或数据集名称。但在这种情况下,这并不是真正的客户端错误。
其他 400
级代码 - 这不是错误的请求或身份验证问题。我们认为我们应该 为请求提供服务,但我们不能。
500 Internal Server Error
- 也许是这个?但是感觉太一般了。这就是错误和意想不到的问题。
501 Not Implemented
- 也许吧?我们还没有实现对涉及大量数据的请求的支持。但是 RFC 似乎暗示这是针对未实现请求方法的情况。但是方法不是这里的问题。
503 Service Unavailable
- 但问题通常不是暂时的。重复请求很可能会因同样的问题而失败。
504 Gateway Timeout
- 从技术上讲这可能是有效的,因为我们有一个面向 public 的 API 服务将这些请求代理到内部服务。但我们不一定要向客户公开此实现细节。
哪个最合适/最不坏?或者还有其他我应该考虑的吗?
如果您想表明这是服务器端错误并且用户可以重试请求 - 使用 5xx
但在你的情况下你似乎想对用户 your query is too big, change it before retrying
说,所以你应该使用 4xx
所以,我会选择 400 Bad Request
。
我正在构建一个 API 对我们存储的非常大的数据库进行分析。有些请求需要很长时间才能处理。我们想主动中止花费超过 10 分钟的请求,但在我们尝试之前,我们不知道请求是否会花费那么长时间。大多数时候,这不是因为暂时的服务器超载。就是用户提出的请求涉及的数据太多,我们根本无法足够快地完成它。
我已经搜索了 list of standard HTTP response codes,但我找不到非常合适的:
409 Conflict
- 也许吧?用户可以更改他们的请求以涉及更小的数据集。但我们觉得这更像是服务器问题,而不是客户端问题。422 Unprocessable Entity
- 也许吧?我们将其用于其他验证错误,例如错误的日期格式或数据集名称。但在这种情况下,这并不是真正的客户端错误。其他
400
级代码 - 这不是错误的请求或身份验证问题。我们认为我们应该 为请求提供服务,但我们不能。500 Internal Server Error
- 也许是这个?但是感觉太一般了。这就是错误和意想不到的问题。501 Not Implemented
- 也许吧?我们还没有实现对涉及大量数据的请求的支持。但是 RFC 似乎暗示这是针对未实现请求方法的情况。但是方法不是这里的问题。503 Service Unavailable
- 但问题通常不是暂时的。重复请求很可能会因同样的问题而失败。504 Gateway Timeout
- 从技术上讲这可能是有效的,因为我们有一个面向 public 的 API 服务将这些请求代理到内部服务。但我们不一定要向客户公开此实现细节。
哪个最合适/最不坏?或者还有其他我应该考虑的吗?
如果您想表明这是服务器端错误并且用户可以重试请求 - 使用 5xx
但在你的情况下你似乎想对用户 your query is too big, change it before retrying
说,所以你应该使用 4xx
所以,我会选择 400 Bad Request
。