Search code examples
resthateoas

How can I implement a RESTful Progress Indicator?


I want my API to be be RESTful

Let say I have started a long running Task with POST and now want to be informed about the progress?

What is the idiomatic REST way to do this?

Poll with GET every 10 seconds?


Solution

  • The response to your

    POST /new/long/running/task
    

    should include a Location header. That header will point to an endpoint the client can hit to find out the status of the task. I would suggest your response look something like:

    Location: http://my.server/task-status/15
    {
        "self": "/task-status/15",
        "status": "running",
        "expectedFinishedAt": <timestamp>
    }
    

    Then your client doesn't have to ping arbitrarily, because the server is giving it a hint as to when to check back. Later GETs to /task-status/15 will return updated timestamps. This saves you from having to blindly poll the server. Of course, this works much better if the server has some idea as to how long it will take to finish processing the task.