列表的各个资源上的 REST API 和 ETag
Posted
技术标签:
【中文标题】列表的各个资源上的 REST API 和 ETag【英文标题】:REST API and ETag on individual resources of a list 【发布时间】:2021-11-12 02:16:44 【问题描述】:考虑到我有一个暴露用户存储库的 REST API:
/users/ -> 返回一个 UserModel 数组 /users/Id -> 返回一个 UserModel我需要实现一个支持离线模式(API 不可用)的客户端应用程序,它将显示用户列表和每个用户的详细信息。
我正在考虑以这种方式在客户端应用程序中同步用户:
-
通过在 /users/ 上调用 GET 来获取完整的用户列表并保留用户列表
每次用户访问用户配置文件时,如果 REST API 可用,请通过调用 REST API 检查用户是否已更新,并在必要时更新用户详细信息
显示用户个人资料
我正在考虑使用 ETag (https://en.wikipedia.org/wiki/HTTP_ETag) 来实现此行为。
我的问题是 我不希望我的客户端应用程序通过调用 GET /users/Id 来一一获取用户详细信息,而是通过调用 GET /users/ 批量获取用户详细信息(如果需要,可以进行一些分页)。如果这样做,客户端应用程序将获得用户列表的全局 ETAG,但不是每个用户的 ETag。因此,它将无法单独验证用户实体是否是最新的。
作为一种解决方法,我正在考虑向 API 的 UserModel 添加一个 ETAG 字段。这样,在调用 GET /users/ 之后,客户端应用程序将能够通过调用带有 If-None-Match
我知道该解决方案不遵守 HTTP 1.1 标准,并且它为 ETag 生成增加了一点复杂性。
但是,我找不到任何其他描述这种解决方案的帖子,我想知道它是否存在重大问题?如果有更优雅的解决方案?
感谢您的帮助,
编辑:WebDav 标准定义了一个类似于我的方法的“DAV:getetag”属性 (http://www.webdav.org/specs/rfc4918.html#cache-control)
【问题讨论】:
【参考方案1】:WebDAV 规范也是我首先想到的。
我认为将 etag 添加到您的收藏响应中没有问题。您甚至可以以更通用的方式定义一个集合,以便格式只是一个 URI 列表、它们的响应和标头,以便您的客户端可以将其视为需要写入缓存的资源列表。
【讨论】:
感谢您的回答,同时我观察到 Azure API 也返回 etags 作为其模型的一部分。接缝的解决方案相当普遍。以上是关于列表的各个资源上的 REST API 和 ETag的主要内容,如果未能解决你的问题,请参考以下文章
在 REST API 中使用 LINK 和 UNLINK HTTP 动词