场景是:我正在实现一个RESTful web服务,它将充当存储在远程C系统上的实体的缓存。web服务的需求之一是,当远程C系统离线时,它将使用最后缓存的数据响应GET请求,但将其标记为“陈旧”。
我计划将数据标记为陈旧的方法是返回一个HTTP状态码,而不是200 (OK)。我考虑使用503 (服务不可用),但我相信它会使一些C#/Java HTTP客户端抛出异常,这将间接迫使用户使用控制流的异常。
你能推荐一个更合适的状态代码吗?或者我应该只返回200并在响应正文中添加一个过期标志?另一种选择是定义一个单独的资源来通知连接状态,并让客户端单独处理它。
发布于 2011-10-25 09:00:06
在马克·诺丁汉的“caching article”中,他说
在某些情况下-例如,当它与网络断开连接时-缓存可以提供过时的响应,而不需要与源站进行检查。
在您的例子中,您的web服务的行为就像一个中间缓存。
当表示已过期或Max-age标头已过时,表示已过时。因此,如果您返回一个包含
Cache-control: Max-age=0那么你实际上是在说你返回的表示已经过时了。假设当您从“系统C”检索表示时,可以认为数据在一段非零的时间内是最新的,您的web服务可以返回这样的表示:
Cache-control: Max-age=3600客户端可以检查最大年龄== 0的高速缓存控制报头,以确定表示在第一次被检索时是否陈旧。
发布于 2011-10-25 02:54:05
只需适当地设置Last-Modified标头,并让客户端决定它是否过时。陈旧数据的上次修改日期将比“正常”日期更早。对于最新数据,请保持Last-Modified header最新。
发布于 2011-10-26 04:25:02
如果你提供的是陈旧的回复,RFC-2616说:
如果存储的响应由于客户端和源服务器的最严格的新鲜性要求而不是“足够新鲜”,则在仔细考虑的情况下,高速缓存仍然可以返回具有适当警告报头的响应(参见13.1.5和14.46节),除非这样的响应被禁止(例如,通过"no-store“高速缓存指令,或者通过"no- cache”高速缓存请求-指令;参见第14.9节)。
换句话说,服务200OK是非常好的。
https://stackoverflow.com/questions/7880280
复制相似问题