列表中单个资源的REST API和ETag



考虑到我有一个REST API公开用户存储库:

  • /用户/→返回UserModel
  • 的数组
  • /用户/{Id}→返回UserModel

我需要实现一个支持离线模式(API不可用)的客户端应用程序,该应用程序将显示用户列表和每个用户的详细信息。

我正在考虑以这种方式同步客户端应用程序中的用户:

  1. 通过调用/users/上的Get来获取完整的用户列表并持久化用户列表
  2. 每次用户访问用户配置文件时,如果REST API可用,检查用户是否已通过调用REST API更新,并在必要时更新用户详细信息
  3. 显示用户配置文件

我正在考虑使用ETag (https://en.wikipedia.org/wiki/HTTP_ETag)来实现此行为。

我的问题是我不希望我的客户端应用程序通过调用get/users/{Id}来逐个获取用户详细信息,而是通过调用get/users/(如果需要的话使用一些分页)来批量获取用户详细信息。如果我这样做,客户机应用程序将获得用户列表的全局ETAG,但不是每个用户的ETAG 。因此,它将无法单独验证用户实体是否为最新的。

作为一种解决方案,我正在考虑在API的UserModel中添加ETAG字段。这样,在调用GET/users/之后,客户端应用程序将能够通过使用if - none - match调用GET/users/{Id}来检查特定用户是否已经更新。头。

我知道这个解决方案不遵守HTTP 1.1标准,而且它给ETag的生成增加了一点复杂性。

然而,我找不到任何其他的帖子描述这样的解决方案,我想知道它是否提出了主要问题?如果有更好的解决方案呢?

谢谢你的帮助,

编辑:WebDav标准定义了一个"DAV:getetag"属性,与我的方法类似(http://www.webdav.org/specs/rfc4918.html#cache-control)

WebDAV规范也是我首先想到的。

我不认为在你的集合的响应中添加标签有什么问题。您甚至可以用更通用的方式定义集合,这样格式只是一个uri列表,它们的响应和标题,这样您的客户端可以将其视为需要写入缓存的资源列表。

最新更新