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

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

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

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


另一个选项:503 -服务不可用。


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

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

状态码的5xx (Server Error)类表示服务器 是否意识到它已经错误或不能执行 请求的方法。除非响应HEAD请求,否则 服务器应该发送一个包含解释的表示 错误的情况,以及它是暂时的还是永久的情况。

Note

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

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

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

注意:

"likely be alleviated after some delay": true for your case. "temporary overload": not pedantically true for your case. But, it could be argued, were your server much faster, the batch processing would have already been done when the client made the request, so it is a kind of "overload": the client is asking for resources faster than the server can make them available. Retrying is suitable for your service, so your reply ought to include a Retry-After value. You could provide as the value the estimated completion time of the next execution of the batch process, or the execution interval of the batch process.

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

客户必须 理解任何状态代码的类,如第一个所示 数字,并将未被识别的状态代码视为等同于 该类的x00状态码

客户端会将您自己的状态代码视为500,即“内部服务器错误”,这是不对的。


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

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


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

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


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

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

http://server/thingyapi/thingyblob/1234

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

404.


501 -未实施

就像听起来一样。一个尚未实现,但暗示将来可用的特性。

这里有一个链接到5xx个错误的摘要。


409年冲突

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

这可能是合适的。

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

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


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

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