如何实现RESTful进度指示器?

时间:2014-07-05 11:23:30

标签: rest hateoas

我希望我的API是RESTful

假设我已经开始了一个长期运行的POST任务,现在想知道进度?

这种惯用的REST方法是什么?

每隔10秒进行一次GET轮询?

3 个答案:

答案 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来检查上载的状态,因为没有合理的方法来识别它(你可能会尝试疯狂的东西,但不推荐)。

同样,客户应该给你反馈,而不是服务器。