我正在开发一个新的 REST-ful API,它的主要/唯一消费者将是一个智能/非网络浏览器客户端。我有一个由后台进程维护/更新的集合资源,而不是由客户端本身。第一次迭代所需的唯一内容类型是 JSON。URI 类似于:
/items/
- 表示项目集合的资源。/items/123
- 代表具有 ID 的单个项目的资源123
。
尽管客户端不会创建新项目或更新集合以添加/删除项目,但它会更新单个项目中的一些值。我的计划是使用 HTTP PATCH 更新项目资源,使用我自己的 JSON 补丁格式。
会有很多并发客户端读取项目,并发更新不同项目,偶尔并发更新同一个项目,虽然允许一定程度的“最终一致性”,但我想将其设计为“缓存友好” “尽可能的方式。阅读 PATCH 的 RFC,我看到在成功响应 PATCH 时,如果有响应,则应该使用响应更新 Request-URI 的缓存。问题归结为:
我是否:
A) 在集合资源 JSON 表示中包含单个项目的完整表示/items/
,并将 PATCH 发送到/items/
URI 并以补丁格式包含要更新的项目?
优点:
- 这允许客户端不必
N
为了显示资源列表而执行多次请求 items
当客户端更新项目时,允许任何缓存失效。
缺点:
- 这对我来说并不“干净”,因为我并没有真正更新集合,而是一个单独的项目。
- 这会使整个集合的缓存无效,而不是更改的单个项目的缓存。
或者
B) 在资源集合的 JSON 表示中,仅包含指向所包含项目的链接,并让客户端在发现集合中有哪些项目后请求各个项目。HTTP PATCH 将被发送到单个项目 URI(例如/items/123
)
优点:
- 独立缓存集合和项目资源。单个项目的 PATCH 可以正确地使该项目的缓存无效。
- API 更清晰,因为您在要更新的特定项目上发出 HTTP PATCH。
缺点:
- 不允许批量更新项目。这目前根本不是要求,未来我也没有预见到,只是事后看来是20-20。
- 要求客户端发出
N+1
请求以显示完整的项目列表。