列表的各个资源上的 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 标头的 GET /users/Id 来检查特定用户是否已更新。

我知道该解决方案不遵守 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的主要内容,如果未能解决你的问题,请参考以下文章

检查 Node.js REST API 上的资源所有权

REST复合/复合/嵌套资源[关闭]

在 REST API 中使用 LINK 和 UNLINK HTTP 动词

笔记:Jersey REST API 设计

如何构建一个 REST API,该 API 采用资源 id 的数组

乐观锁定:使用其他资源修改资源