关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 6年前关闭。本帖上个月已编辑提交审核,未能重新打开该帖:原始关闭原因未解决 改进此问题
我正在开发一个 RESTful API,其中 http://server/thingyapi/thingyblob/1234
返回与要下载的项目 #1234 关联的文件(又名“blob”)。但是可以在文件生成之前提出请求。它肯定将在以后可用。
服务器中有一个生成所有 blob 的批处理过程。项目 1234 已经存在,并且它的数据(而不是 blob)已经可用。服务器还没有生成 1234 的 blob。
我不想返回 404;那是为了不存在的东西。这将存在,但尚未生成。有点像正在“处理”的 YouTube 视频。我认为重定向代码也不合适;没有“其他”网址可以尝试。
在这种情况下返回的正确 HTTP 状态代码是什么?
204
“无内容”怎么样? Is 表示服务器已经成功处理了请求并且没有返回任何内容[此时]。
我建议202 - Accepted
。从 documentation:
请求已被接受处理,但处理尚未完成。 [...] 它的目的是允许服务器接受对其他进程的请求(可能是一个每天只运行一次的面向批处理的进程)
这样的“问题”在服务器端:客户端发出了格式良好的请求,但服务器不能满足它。所以我倾向于“服务器错误”,5xx 状态码。
Quoth RFC 7231(当前的 HTTP 标准,已添加重点):
5xx(服务器错误)类状态码表示服务器知道它出错或无法执行请求的方法。除了响应 HEAD 请求时,服务器应该发送一个包含错误情况解释的表示,以及它是暂时的还是永久的条件。
笔记
“错误或无法执行请求”:尽管它们的标题是“服务器错误”,但它们不仅仅针对服务器错误。
“临时或永久”:这些代码适用于暂时不可用的资源,例如您的资源。
在可用的代码中,我会说 503, "Service Unavailable" 是最合适的:
503(服务不可用)状态码表示服务器当前由于临时过载或计划维护而无法处理请求,延迟一段时间后可能会得到缓解。服务器可以发送一个 Retry-After 头域...建议客户端在重试请求之前等待适当的时间。
笔记:
“经过一段时间的延迟可能会得到缓解”:对于您的情况是正确的。
“临时超载”:对您的情况而言并非迂腐正确。但是,可以说,如果您的服务器快得多,那么当客户端发出请求时,批处理就已经完成了,所以这是一种“过载”:客户端请求资源的速度比服务器可以做出的更快它们可用。
重试适合您的服务,因此您的回复应包含 Retry-After 值。您可以提供批处理的下一次执行的估计完成时间或批处理的执行间隔作为值。
定义您自己的 5xx 状态代码(例如 591),虽然是 permitted,但会有错误的语义:
客户端必须理解任何状态代码的类别,如第一个数字所示,并将无法识别的状态代码视为等同于该类别的 x00 状态代码
客户会将您自己的状态代码视为 500, "Internal Server Error",这是不对的。
307 - TEMPORARY REDIRECT
一起使用,如果您想在资源“准备好”时强制客户端在其他地方等待,这很好
我认为 423 - Locked 可用于此目的:
423 (Locked) 状态码表示方法的源或目标资源被锁定。此响应应包含适当的前置条件或后置条件代码,例如“lock-token-submitted”或“no-conflicting-lock”。
我不想返回 404;那是为了不存在的东西。
该 URL 与对事物的请求不对应。
http://server/thingyapi/thingyblob/1234
客户端正在请求不存在的thingyblob。如果它存在,你会把它给他们。
404。
503
是适当的回应。更不用说其他一些奇怪的建议了。
另一个选项:503 - Service Unavailable
。
由于您的资源尚未准备好,您可能知道(大约)它何时可用以及客户何时可以重试他的请求。这意味着您可能想要使用 Retry-After header。此标头对 503(服务不可用)有效,这意味着整个站点因维护而停机,以及 3xx(重定向)响应。
在我看来,带有 Retry-After 标头的 302(找到)将是最佳选择,但我不确定响应标头的 Location 字段是否可以等于请求 url。无论如何,这是循环重定向。
409 冲突
表示由于请求中的冲突而无法处理请求,例如多次更新时的编辑冲突。 [来源维基百科。]
这可能是适当的。
如果您无法通过返回数据来满足请求 - 那么它就不会成功。我认为 202 表明服务器已将请求排队,稍后将完成请求。但是在您的情况下,请求现在是针对数据的并且失败了。如果您稍后重试,这是一个不同的请求。
我认为你有冲突..你想要数据..但它正在编辑/更新。如果 Thingy1234 已经存在并且之前已成功下载,但现在正在编辑的过程中在编辑进行时不可用,也会出现这种情况。
501 - 未实施
就像它的声音一样。尚未实现但暗示未来可用性的功能。
这是指向 summary of 5xx errors 的链接。