The scenario is: I’m implementing a RESTful web-service that will act as a cache to entities stored on remote a C system. One of the web-service’s requirements is that, when the remote C system is offline, it would answer GET requests with the last cached data, but flagging it as “stale”.
The way I was planning to flag the data as stale was returning a HTTP status code other than 200 (OK). I considered using 503 (service unavailable), but I believe that it would make some C#/Java HTTP clients throw exceptions, and that would indirectly force the users to use exceptions for control flow.
Can you suggest a more appropriate status code? Or should I just return 200 and add a staleness flag to the response body? Another option would be defining a separate resource that informs the connectivity state, and let the clients handle that separately.
In Mark Nottingham’s caching article he says
In your case, your web service is behaving like an intermediary cache.
A representation is stale when either it’s Expires or Max-age header has passed. Therefore if you returned a representation with
Then you are effectively saying that the representation you are returning is already stale. Assuming that when you retrieve representations from the “System C” that the data can be considered fresh for some non-zero amount of time, your web service can return representations with something like,
The client can check cache control header for max-age == 0 to determine if the representation was stale when it was first retrieved or not.