如何在REST API中select“尚未准备好,稍后再试”的HTTP状态码?

我正在开发一个RESTful API,其中http://server/thingyapi/thingyblob/1234返回与thingy#1234关联的文件(又名“blob”)以供下载。 但可能是请求是在服务器中不存在文件的时候发出的,但是最后肯定提供。 在服务器中有一个批处理过程,为所有事物生成所有的斑点。 Thingy 1234已经存在,它的数据,除了blob,已经可用了。 服务器还没有产生thingy 1234的blob呢。

我不想返回404; 那是不存在的东西。 这是存在的东西,但它的blob还没有产生。 有点像YouTube的video,“处理”。 我不认为redirect代码是适当的; 有没有“其他”的url来尝试。

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

我build议202 - Accepted 。 从文档 :

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

这个“问题”就是在服务器端:客户端提出了一个格式良好的请求,但服务器不能满足它。 所以我倾向于一个“服务器错误”,5xx状态码。 说出标准 :

以数字“5”开头的响应状态代码表示服务器意识到错误或无法执行请求的情况…服务器应该包括一个实体[指示]它是临时还是永久状态。

注意

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

在可用的代码中,我会说503,“服务不可用”是最合适的:

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

注意:

  • “一段时间后会缓解的暂时情况”:对你的情况是正确的。
  • “临时超载”:对于你的情况来说,不是那么迂腐。 但是,有人可能会说,如果你的服务器要快得多,当客户端发出请求时批处理已经完成了,所以这一种“超载”:客户端比服务器要求更快他们可用。
  • “客户端应该处理500响应的响应”:这是“内部服务器错误”,即服务器由于错误而失败时的响应types。 这个标准似乎意味着一个performance良好的客户不应该在这种情况下重试。 重试适合您的服务,所以您的答复应该包括一个Retry-After值。 您可以提供批量处理的下一次执行的估计完成时间或批处理的执行间隔。

定义你自己的5xx状态码(例如591)虽然允许 ,但是会有错误的语义:

HTTP状态代码是可扩展的…应用程序必须理解任何状态代码的类,如第一个数字所示,并将任何未识别的响应视为等同于该类的x00状态代码

客户会把你自己的状态代码当作500,“内部服务器错误”,这正如我上面所讨论的那样。

另一个选项: 503 - Service Unavailable

由于你的资源没有准备好,你可能知道什么时候(大概)它可用,什么时候客户端可以重试他的请求。 这意味着您可能想要使用Retry-After标题 。 这个头有效的503(服务不可用),这意味着整个网站closures维护,3xx(redirect)响应。

在我看来302(发现)与Retry-After头将是最好的select,但我不知道如果应答头的位置字段可以等于请求的URL。 无论如何,这是循环redirect。

我不想返回404; 那是不存在的东西。

该URL不对应于对某个事物的请求。

http://server/thingyapi/thingyblob/1234

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

404。

我认为423locking可以用于这个目的:

423(locking)状态码表示方法的源或目标资源被locking。 这个响应应该包含一个合适的前置条件或后置条件代码,比如'locking令牌提交'或者'无冲突locking'。

501 – 未实施

完全像它听起来一样。 一个尚未实现的function,但意味着未来的可用性。

这是一个5xx错误摘要的链接。

409冲突

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

这可能是适当的。

如果你不能通过返回数据来完成请求 – 那么它不会成功。 我认为202表明服务器已经排队请求,它将在稍后完成请求。 但在你的情况下,请求是现在的数据和失败。 如果以后再试,这是一个不同的要求。

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