我希望我的API是RESTful
假设我已经开始了一个长期运行的POST任务,现在想知道进度?
这种惯用的REST方法是什么?
每隔10秒进行一次GET轮询?
答案 0 :(得分:3)
REST工作的方式,或者说它使用的机制 - HTTPS GET / POST / PUT / DELETE等没有提供一种机制来建立事件驱动机制,服务器可以将数据发送到客户。虽然,理论上可以在您的服务器和客户端都具有客户端/服务器功能 - 尽管我个人不赞同这种设计。因此,有一些提交API - POST / PUT,然后是状态查询机制 - GET可以完成这项工作。
答案 1 :(得分:3)
对您的回复
POST /new/long/running/task
应包含Location标头。该标头将指向客户端可以点击以找出任务状态的端点。我建议你的回答如下:
Location: http://my.server/task-status/15
{
"self": "/task-status/15",
"status": "running",
"expectedFinishedAt": <timestamp>
}
然后您的客户端不必任意ping,因为服务器正在给它一个关于何时检查的提示。稍后GET
到/task-status/15
将返回更新的时间戳。这样您就不必盲目地轮询服务器。当然,如果服务器对完成任务处理需要多长时间有所了解,这种方法会更好。
答案 2 :(得分:1)
客户端应该是提供该信息的客户端,显示已经向服务器发送了多少字节。服务器不应该关心部分上载的资源。
除此之外,您将返回一个“Location”标题,指示创建资源的位置,但不是更早。我的意思是,当您发布POST时,您不知道哪个将是资源的地址(稍后在Location头中指出),因此没有合理的方法来提供URL来检查上载的状态,因为没有合理的方法来识别它(你可能会尝试疯狂的东西,但不推荐)。
同样,客户应该给你反馈,而不是服务器。