我正在设计一个用于移动应用的RESTful API。我的问题是如何处理包含许多项的大型集合。我知道一种好的做法是对集合中的大量结果进行分页。
我已经阅读了Facebook Graph API文档 (https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2),Twitter cursors文档 (https://dev.twitter.com/overview/api/cursoring),GitHub API文档 (https://developer.github.com/v3/) 和这篇文章 (API pagination best practices)。
考虑一个名为
现在我的问题是这样的情景:
1- 我使用上述内容获取
2- 之后,资源集合中添加了一些内容(比如说另一个设备为此帐户添加了新资源)。因此,我现在有101个资源。
3- 根据初始响应,我使用
我已经阅读了Facebook Graph API文档 (https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2),Twitter cursors文档 (https://dev.twitter.com/overview/api/cursoring),GitHub API文档 (https://developer.github.com/v3/) 和这篇文章 (API pagination best practices)。
考虑一个名为
/resources
的示例集合在我的API中包含100个按降序排序的项目,从resource1
到resource100
。当您发出GET请求 (GET http://api.path.com/resources?limit=5
)时,您将获得以下响应:{
"_links": {
"self": { "href": "/resources?limit=5&page=1" },
"last": { "href": "/resources?limit=5&page=7" },
"next": { "href": "/resources?limit=5&page=2" }
},
"_embedded": {
"records": [
{ resource 100 },
{ resource 99 },
{ resource 98 },
{ resource 97 },
{ resource 96 }
]
}
}
现在我的问题是这样的情景:
1- 我使用上述内容获取
/resources
。2- 之后,资源集合中添加了一些内容(比如说另一个设备为此帐户添加了新资源)。因此,我现在有101个资源。
3- 根据初始响应,我使用
/resources?limit=5&page=2
获取下一页结果。响应如下:{
"_links": {
"self": { "href": "/history?page=2&limit=5" },
"last": { "href": "/history?page=7&limit=5" },
"next": { "href": "/history?page=3&limit=5" }
},
"_embedded": {
"records": [
{ resource 96 },
{ resource 95 },
{ resource 94 },
{ resource 93 },
{ resource 92 }
]
}
}
正如您所看到的,资源96
在两个页面中都重复出现(或者如果在第2步中删除了资源,则可能会发生类似的问题,在这种情况下,一个资源将会丢失)。
由于我想在移动应用程序和一个列表中使用它,因此我必须将每个API调用的资源附加到之前的资源上,以便我可以拥有完整的列表。但是这很麻烦。如果您有建议,请告诉我。提前致谢。
附言:我已经考虑过像查询字符串一样的时间戳而不是基于游标的分页,但那会给我带来其他问题。(如果您需要更多信息,请告诉我。)