我正在使用flask-restful开发RESTful Web服务。
客户端需要能够请求服务器执行作业。这项工作可能需要约1秒至约1小时才能完成。一般来说,预计需要1-5分钟。
作业完成后,客户端需要下载JSON转储。从100KB到100MB的任何地方。
我看到两个选项:
REST原则下首选哪个选项?
我在选项1中看到的问题是在等待响应时网络中断的可能性。
答案 0 :(得分:5)
等待超过几秒是绝对禁止。
大多数Web基础结构并非旨在处理如此长的延迟,并且某些代理/负载平衡器可能会超时 - 即使您的服务器最终产生响应,也没有人会在那里读取它。此外,用户将感到无聊并开始刷新/取消/无论如何。
正如@jonrsharpe在评论中提到的那样,您的服务器应该尽快回复有关正在发生的事情的信息。输入202 Accepted
状态代码:
请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际处理时可能不允许该请求。没有从异步操作中重新发送状态代码的工具。
(取自restapitutorial)
因此,请回复202
以及结果所在位置的句柄 - 在正文或回复标题中。然后,客户端可以轮询给定位置以查看作业状态并下载结果。
如果结果很大,那么对结果允许HEAD
请求也是合理的,这样用户就可以轮询HEAD
来检查结果是否可用,然后用{{1}下载它们在投票期间没有突然被淹没。