我正在开发一个RESTful API,其中http://server/thingyapi/thingyblob/1234返回与项目#1234相关联的文件(又名“blob”)以下载。但是可以在生成文件之前提出请求。它肯定会在以后的时间可用。

服务器中有一个批处理进程生成所有的blob。Item 1234已经存在,它的数据(除了blob)已经可用。服务器还没有生成1234的blob。

我不想返回404;那是指不存在的事物。它会存在,但还没有生成。有点像YouTube上的“处理”视频。我也不认为重定向代码是合适的;没有“其他”URL可以尝试。

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


当前回答

由于您的资源还没有准备好,您可能知道它(大约)什么时候可用,什么时候客户可能会重试他的请求。这意味着您可能想要利用Retry-After报头。此报头在503(服务不可用)下有效,这意味着整个站点正在进行维护,并响应3xx(重定向)。

在我看来,302(发现)与Retry-After报头将是最好的选择,但我不确定响应报头的位置字段是否可以等于请求url。这是循环重定向。

其他回答

我建议202 -接受。从文档中可以看到:

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

由于您的资源还没有准备好,您可能知道它(大约)什么时候可用,什么时候客户可能会重试他的请求。这意味着您可能想要利用Retry-After报头。此报头在503(服务不可用)下有效,这意味着整个站点正在进行维护,并响应3xx(重定向)。

在我看来,302(发现)与Retry-After报头将是最好的选择,但我不确定响应报头的位置字段是否可以等于请求url。这是循环重定向。

409年冲突

指示由于请求中的冲突而无法处理请求,例如在多次更新的情况下发生编辑冲突。(维基百科来源。)

这可能是合适的。

如果你不能通过返回数据来满足请求-那么它不是一个成功。我认为202表明服务器已经排队请求,它将在以后完成请求。但在您的情况下,请求现在是数据,并且失败了。如果稍后重试,则是不同的请求。

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

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

423(锁定)状态码表示方法的源资源或目标资源是锁定的。此响应应包含适当的前置条件或后置条件代码,例如“锁令牌已提交”或“无冲突锁”。

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

URL不对应于某个东西的请求。

http://server/thingyapi/thingyblob/1234

客户端正在请求一个thingyblob,但它并不存在。如果真有,你会给他们的。

404.