如何在REST API中选择HTTP状态代码,用于"未准备好,稍后再试"?

时间:2012-03-20 20:49:23

标签: http rest language-agnostic batch-processing http-status-codes

我正在开发一个RESTful API,其中http://server/thingyapi/thingyblob/1234返回与thingy#1234相关联的文件(也称为“blob”)以进行下载。但可能是请求是在服务器中不存在该文件的情况下进行的,但绝大多数 将在以后可用。服务器中有一个批处理过程,可以为所有东西生成所有blob。 Thingy 1234已经存在,其数据(blob除外)已经可用。服务器还没有生成东西1234的blob。

我不想退回404;那是不存在的东西。这是一个存在的东西,但它的blob尚未生成。有点像YouTube视频的“处理”。我认为重定向代码也不合适;尝试没有“其他”网址。

在这种情况下返回的HTTP状态代码是什么?

8 个答案:

答案 0 :(得分:71)

我建议202 - Accepted。来自documentation

  

请求已被接受处理,但处理尚未完成。 [...]   其目的是允许服务器接受对其他进程的请求(可能是每天只运行一次的面向批处理的进程)

答案 1 :(得分:40)

“问题”,例如,在服务器端:客户端已经形成了良好的请求,但服务器无法满足它。所以我倾向于“服务器错误”,5xx状态代码。

Quoth RFC 7231(当前的HTTP标准,强调添加):

  

5xx(服务器错误)类状态代码表示服务器      意识到它已经错误或者无法执行      要求的方法。除了响应HEAD请求时,      服务器应该发送一个包含对的解释的表示      错误情况,以及它是临时还是永久性条件。

请注意

  • “错误无法执行请求”:尽管标题为“服务器错误”,但它们不仅仅是服务器错误。
  • 临时或永久”:这些代码适用于暂时不可用的资源,例如您的资源。

在可用的代码中,我认为503, "Service Unavailable"最合适:

  

503(服务不可用)状态代码表示服务器      由于临时过载,目前无法处理请求      或定期维护,一些后可能会缓解      延迟。服务器可以发送一个Retry-After标头字段......以建议适当的时间量      客户端在重试请求之前等待。

注意:

  • “在一段时间后可能会缓解”:对你的情况来说是真的。
  • “临时超载”:对你的情况并非迂腐。但是,可以说,如果您的服务器速度更快,当客户端发出请求时批处理已经完成,那么<​​em> 是一种“过载”:客户端要求比服务器更快的资源可以使它们可用。
  • 重试适用于您的服务,因此您的回复应包含Retry-After值。您可以提供下次执行批处理的估计完成时间或批处理的执行间隔作为值。

定义您自己的5xx状态代码(例如591)虽然permitted,但语义错误:

  

客户必须      了解任何状态代码的类,如第一个所示      数字,并将无法识别的状态代码视为等效      该类的x00状态代码

客户端会将您自己的状态代码视为500, "Internal Server Error",这不正确。

答案 2 :(得分:22)

我认为423 - Locked可以用于此目的:

  

423(已锁定)状态代码表示方法的源或目标资源已锁定。这个响应应该包含一个适当的前置条件或后置条件代码,例如“锁定令牌 - 提交的”#39;或者&#39; no-conflicting-lock&#39;。

答案 3 :(得分:18)

另一种选择:503 - Service Unavailable

答案 4 :(得分:17)

  

我不想要回归404;那些不存在的东西。

网址与商品请求不对应。

http://server/thingyapi/thingyblob/1234

客户正在请求一个不存在的thingyblob。如果它存在,你会把它交给他们。

404

答案 5 :(得分:16)

由于您的资源尚未就绪,您可能知道何时(大约)它可用以及何时客户端可能会重试其请求。这意味着您可能希望使用Retry-After header。此标头对503(服务不可用)有效,这意味着整个站点已关闭进行维护,以及3xx(重定向)响应。

在我看来302(Found)有Retry-After标头是最好的选择,但我不确定响应标头的Location字段是否可以等于request url。无论如何,这是循环重定向。

答案 6 :(得分:3)

501 - 未实施

完全像听起来一样。尚未实现的功能,但意味着将来的可用性。

以下是summary of 5xx errors的链接。

答案 7 :(得分:3)

409冲突

表示由于请求中的冲突而无法处理请求,例如多次更新时的编辑冲突。 [来源维基百科。]

这可能是合适的。

如果您无法通过返回数据来满足请求 - 那么它就不会成功。我认为202建议服务器对请求进行排队,它将在稍后完成请求。但在您的情况下,请求现在是数据,但已失败。如果您稍后重试,则会有不同的请求。

我认为你有冲突..你想要数据..但它正在被编辑/更新。如果Thingy1234已经存在并且之前已经成功下载,也会出现这种情况,但是在编辑过程中,现在正处于编辑过程中是不可用的。