如何在RESTAPI中选择HTTP状态代码以“尚未准备好,稍后再试”?[已关闭]

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (76)

我正在开发一个RESTfulAPIhttp://server/thingyapi/thingyblob/1234返回要下载的与Thingy#1234关联的文件(又名“BLOB”)。但是,可能是请求是在服务器中不存在的文件中同时发出的。服务器中有一个批处理过程,它为所有的日志生成所有的BLOB。Thingy 1234已经存在,它的数据(BLOB除外)已经可用。服务器还没有生成1234的BLOB。

我不想返回404;这是为了不存在的思想。这是一个存在的东西,但它的斑点还没有产生。有点像YouTube上的“处理”视频我认为重定向代码也是不合适的;没有“其他”URL可以尝试。

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

提问于
用户回答回答于

我建议202 - Accepted

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

用户回答回答于

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

以数字“5”开头的响应状态代码表示服务器知道其错误或无法执行请求的情况...服务器应包括一个实体指示是暂时的还是永久性的。

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

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

由于服务器临时超载或维护,服务器当前无法处理请求。这意味着这是一种暂时性的情况,经过一段时间的拖延后将得到缓解。如果已知,延迟的长度可以在重试后报头中指示。如果没有进行重试,客户端应该处理响应,就像处理500个响应一样。

注:

  • “暂时性的情况,经过一段时间后将得到缓解”:对你的情况是正确的。
  • “临时超载”:对你的情况不是脚踏实地的。但是,可以说,如果你的服务器速度快得多,那么当客户端提出请求时,批处理就已经完成了,所以一种“重载”:客户端请求资源的速度快于服务器所能提供的速度。
  • “客户端应该处理响应,就像处理500个响应一样。”:这是“内部服务器错误”,即当服务器由于错误而失败时的响应类型。这个标准似乎意味着一个行为良好的客户应该在这个案子里再试一次。重试适用于你的服务,因此你的答复应包括Retry-After价值。可以提供批处理下一次执行的估计完成时间或批处理的执行间隔作为值。

定义自己的5xx状态代码(例如,591),会产生错误的语义:

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

客户端将自己的状态代码处理为500,“内部服务器错误”。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励