17

我有一个应用程序需要来自 Service2 的数据,它将永远为给定的请求返回相同的答案,除非它的支持数据库被更新。数据库很少更新,比如说每年两次。

我想设计一个解决方案,以便应用程序缓存来自 Service2 的答案,但在外部提供一个功能以使应用程序的缓存无效。我想过从应用程序中公开一个 RESTful web 服务,但我对如何正确设计它感到困惑。

/application/cache/invalidate是一个非 RESTful URL - 我正在考虑/application/cache/使用 HTTP POST 调用。但是,在我看来,对于正确的 RESTful 设计,当使用 POST 更新资源时,要更新的内容应该包含在请求的正文中。

设计“InvalidateCache”宁静网络服务的正确方法是什么?

4

2 回答 2

18

考虑使用DELETE而不是POST和 url:

/application/cache/ 

在 REST 中,两者PUTDELETE都被认为是幂等操作。也就是说,它们可以以相同的结果资源状态重复多次。在这种情况下,您的缓存是资源,多个DELETE' 将导致相同的状态,即清除缓存。

您可以考虑在您的 url 中添加一个描述符,以澄清您正在清除缓存的内容而不是删除缓存对象本身。就像是

/application/cache/contents

也许,但这取决于你。走这条路还可能让您在必要时有选择地从缓存中删除。

于 2012-11-08T16:21:28.553 回答
6

这可能无法直接回答您的问题,但您可能还想查看HTTP ETags,它非常适合在 RESTful 设计中进行缓存。

这个想法是应用程序将从 Service2 获取资源,这将返回资源以及 ETag 标头(它可以是最后修改的时间戳或哈希)。然后应用程序将该资源与 ETag 一起缓存。

当应用程序需要再次使用该资源时,它可以向 Service2 发送一个 HTTP GET,并带有它在缓存中的 ETag 标头。

  • 如果 Service2 发现该资源自第一次返回给 Application 以来没有发生变化,则返回一个空响应,HTTP 状态为 304(未修改),表示 Application 可以使用缓存中的数据。
  • 如果数据已更新,Service2 将返回带有新 ETag 标头(和 HTTP 状态 200)的新资源。

如果您不介意通过 HTTP GET 来查看资源是否已更改,并且 Service2 可以确定资源是否已更改(无需加载)是否容易,这种方法效果很好。

优点是 Service2 不必使其客户端(应用程序)的缓存无效,这可能不是一个很好的做法(如果您有很多客户端,可能很难做到)。

于 2012-11-08T20:38:27.287 回答