如何使用REST仅返回集合中已更改的资源

如何使用REST仅返回集合中已更改的资源,rest,api-design,Rest,Api Design,假设我正在设计一个RESTAPI,它应该返回经过身份验证的用户的联系人列表 e.g. /users/me/contacts 为了提高性能,我将返回一个ETag,并在将来的GET请求中在If None匹配头中提供它。假设没有任何更改,那么API将返回未修改的响应 但是,当联系人列表发生变化时会发生什么情况?我不想再次返回整个集合,只返回新的和修改过的项目 我可以发送一个HEAD请求,比较etag,然后发送一个新项目的后续GET请求,但这似乎有点浪费 我刚刚遇到了If范围头,它看起来可以解决这个问

假设我正在设计一个RESTAPI,它应该返回经过身份验证的用户的联系人列表

e.g. /users/me/contacts
为了提高性能,我将返回一个ETag,并在将来的GET请求中在If None匹配头中提供它。假设没有任何更改,那么API将返回未修改的响应

但是,当联系人列表发生变化时会发生什么情况?我不想再次返回整个集合,只返回新的和修改过的项目

我可以发送一个HEAD请求,比较etag,然后发送一个新项目的后续GET请求,但这似乎有点浪费

我刚刚遇到了If范围头,它看起来可以解决这个问题,但它似乎还需要以字节为单位指定的范围头


您认为If范围标题是一种方法,还是我遗漏了一些明显的东西?

REST是关于资源的。如果
/users/me/contacts
是资源(联系人列表)的URL,则它必须始终返回资源状态的完整表示形式

如果要仅检索已更改的联系人,请使用查询参数:

/users/me/contacts?newerThan=20130513124300
客户端上次访问资源的日期


这将是RESTful的,因为
newerThan的每个不同值将形成不同的URL。

谢谢。你知道如果一个记录被删除会发生什么吗?是否会在“newerThan”数据中以某种方式返回…?@MeV也许您可以为is_deleted设置一个单独的标志,而不是实际删除任何内容。newerThan查询参数很好,但是如果遵循一些标准,比如if-Modified-Since头,那就更好了(但我更喜欢使用query-param),这样人们就知道名称、格式以及如何处理不同步的时钟,但是为什么不使用UTC格式的时间戳而不是数字时间戳呢?这样你就可以处理时区了