在RESTful Web服务中,服务器是否可以花费很多分钟来响应?

eda*_*lls 1 python rest flask restful-architecture flask-restful

我正在使用flask-restful开发RESTful Web服务.

客户端需要能够请求服务器执行的作业.这项工作可能需要约1秒至约1小时才能完成.一般来说,预计需要1-5分钟.

作业完成后,客户端需要下载JSON转储.从100KB到100MB的任何地方.

我看到两个选项:

  1. 客户端将作业作为POST请求提交,而服务器的响应仅在作业完成时提供.响应包括JSON转储.
  2. 客户端将作业作为POST请求提交,服务器立即响应200 OK.然后,客户端每隔60秒提交一次GET状态请求.作业完成后,它会提交另一个GET请求来下载JSON转储.

REST原则下哪个选项更受欢迎?

我在选项1中看到的问题是在等待响应时网络中断的可能性.

小智 5

等待超过几秒钟绝对禁止.

大多数Web基础结构不是为处理如此长的延迟而设计的,并且某些代理/负载平衡器可能会超时 - 即使您的服务器最终产生响应,也没有人会在那里读取它.此外,用户将感到无聊并开始刷新/取消/无论如何.

正如@jonrsharpe在评论中提到的那样,您的服务器应该尽快回复有关正在发生的事情的信息.输入202 Accepted状态代码:

该请求已被接受处理,但处理尚未完成.该请求最终可能会或可能不会被执行,因为在实际处理时可能不允许该请求.没有用于从诸如此类的异步操作重新发送状态代码的工具.

(取自restapitutorial)

因此,回答202和处理结果应该在哪里 - 在正文或响应标题中.然后,客户端可以轮询给定位置以查看作业状态并下载结果.

如果结果很大,则允许HEAD对结果发出请求也是合理的,这样用户可以轮询HEAD以检查结果是否可用,然后下载它们GET,而不会在轮询期间突然泛滥.