如何实现RESTful进度指示器?

如何实现RESTful进度指示器?,rest,hateoas,Rest,Hateoas,我希望我的API是RESTful的 比如说,我已经开始了一项长期运行的POST任务,现在想了解进展情况吗 惯用的REST方法是什么 每隔10秒使用GET进行一次轮询?REST的工作方式,或者更确切地说,它使用的机制—HTTPS GET/POST/PUT/DELETE等—没有提供一种机制,使服务器能够将数据发送到客户端的事件驱动机制。虽然,从理论上讲,在您的服务器和客户机中都有客户机/服务器功能是可能的,但我个人并不赞同这种设计。因此,使用某种提交API(POST/PUT)和状态查询机制(GET)

我希望我的API是RESTful的

比如说,我已经开始了一项长期运行的POST任务,现在想了解进展情况吗

惯用的REST方法是什么


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

REST的工作方式,或者更确切地说,它使用的机制—HTTPS GET/POST/PUT/DELETE等—没有提供一种机制,使服务器能够将数据发送到客户端的事件驱动机制。虽然,从理论上讲,在您的服务器和客户机中都有客户机/服务器功能是可能的,但我个人并不赞同这种设计。因此,使用某种提交API(POST/PUT)和状态查询机制(GET)就可以完成这项工作

客户端应该是向您提供该信息的客户端,向您显示已经向服务器发送了多少字节。服务器不应关心部分上载的资源

抛开这一点不谈,您将返回一个“Location”头,指示资源创建后的位置,而不是更早的位置。我的意思是,当你发布时,你不知道哪个是资源的地址(这在后面的位置标题中指出),因此没有合理的方法提供URL来检查上传的状态,因为在完成之前没有合理的方法来识别它(你可以尝试疯狂的事情,但这是不推荐的)

同样,客户机应该向您提供反馈,而不是服务器。

对您的请求的响应

POST /new/long/running/task
应包括位置标题。该标头将指向客户端可以点击的端点,以了解任务的状态。我建议您的回答如下:

Location: http://my.server/task-status/15
{
    "self": "/task-status/15",
    "status": "running",
    "expectedFinishedAt": <timestamp>
}
位置:http://my.server/task-status/15
{
“自我”:“/任务状态/15”,
“状态”:“正在运行”,
“预期完成日期”:
}

这样,您的客户机就不必随意ping,因为服务器会提示它何时返回。稍后,
GET
s to
/task status/15
将返回更新的时间戳。这样可以避免盲目轮询服务器。当然,如果服务器知道完成任务需要多长时间,这会更好。是的,
GET
task resource应该包含关于其状态的信息。因此我发现REST基本上不支持我的用例。现在我每15秒轮询一次服务器。但这有很多缺点,并产生了大量的流量。我认为对于我的API的这一部分,我必须使用类似web套接字的东西。实际上,我正在上载一个文件,但是服务器上发生了长时间的转换(大约1到5分钟)。是的,这将增强GET请求并节省服务器资源。我只是想知道,因为我有更多的请求,这将受益于一个进度指示,如果罗伊·菲尔丁会接受这些GUI请求,我会使用websocckets@jackWebSocket不是很安静,但这很好。如果您认为REST不是web服务的正确实现,Roy不会亲自考虑。我的意思是,我的API的主要部分是restful的,只是在进度指示器部分,我将不再使用restful。你认为他会同意吗?