我应该使用什么HTTP状态代码来处理可能返回陈旧数据的GET请求?

时间:2011-10-24 18:44:28

标签: web-services rest

场景是:我正在实现一个RESTful Web服务,它将作为存储在远程C系统上的实体的缓存。 Web服务的一个要求是,当远程C系统脱机时,它将使用最后一个缓存数据回答GET请求,但将其标记为“陈旧”。

我计划将数据标记为陈旧的方式是返回200以外的HTTP状态代码(OK)。我考虑使用503(服务不可用),但我相信它会使一些C#/ Java HTTP客户端抛出异常,这会间接迫使用户使用控制流的异常。

您能否建议更合适的状态代码?或者我应该返回200并向响应正文添加陈旧标志?另一种选择是定义一个通知连接状态的单独资源,并让客户端单独处理它。

4 个答案:

答案 0 :(得分:4)

只需适当设置Last-Modified标头,让客户决定它是否过时。过时数据的Last-Modified日期将比“normal”更远。对于最新数据,请将Last-Modified标头保持最新。

答案 1 :(得分:2)

如果您提供过时的回复RFC-2616说:

  

如果存储的响应最不够“新鲜”   客户和客户的限制性新鲜度要求   原始服务器,在仔​​细考虑的情况下缓存   可能仍会使用适当的警告返回响应   标题(见第13.1.5和14.46节),除非有这样的回应   是禁止的(例如,通过“无商店”缓存指令,或通过   “no-cache”cache-request-directive;见第14.9节)。

换句话说,提供200 OK确实很好。

答案 2 :(得分:2)

我会返回200 OK和适当的应用程序特定响应。没有其他HTTP状态代码似乎是合适的,因为决定是否以及如何使用响应正在传递给客户端。我还建议不要为此目的使用标准的HTTP缓存控制头。我只会使用它们来控制第三方(中间和客户端)缓存。使用这些头来传递特定于应用程序的信息会将应用程序逻辑与缓存控制联系起来。虽然它可能不会立即显而易见,但是在独立发展应用程序逻辑和缓存策略的能力方面存在真正的长期利益。

答案 3 :(得分:1)

在Mark Nottingham的caching article他说

  

在某些情况下 - 例如,当它与之断开连接时   网络 - 缓存可以提供陈旧的响应而无需检查   原始服务器。

在您的情况下,您的Web服务就像中间缓存一样。

当Expires或Max-age标头已经过去时,表示是陈旧的。因此,如果您使用

返回了一个表示
Cache-control: Max-age=0

然后你有效地说你要回归的陈述已经陈旧了。假设当您从“系统C”检索表示数据可以被认为是新的非零时间时,您的Web服务可以返回类似的表示,

Cache-control: Max-age=3600

客户端可以检查max-age == 0的缓存控制头,以确定表示在首次检索时是否过时。