我喜欢一些一些帮助处理一个奇怪的边缘情况与分页API我正在建设。
与许多api一样,这个api也会分页较大的结果。如果你查询/foos,你会得到100个结果(即foo #1-100),和一个链接到/foos?Page =2,返回foo #101-200。
不幸的是,如果在API使用者进行下一次查询之前从数据集中删除了foo #10, /foos?Page =2将偏移100并返回foos #102-201。
这对于试图获取所有foo的API使用者来说是一个问题——他们不会收到foo #101。
处理这种情况的最佳实践是什么?我们希望使它尽可能的轻量级(即避免为API请求处理会话)。来自其他api的示例将非常感谢!
RESTFul api中的另一个分页选项是使用这里介绍的Link头。例如,Github使用它如下:
Link: <https://api.github.com/user/repos?page=3&per_page=100>; rel="next",
<https://api.github.com/user/repos?page=50&per_page=100>; rel="last"
rel的可能值是:first, last, next, previous。但是通过使用Link头,可能无法指定total_count(元素的总数)。
你有几个问题。
首先,你有你引用的例子。
如果插入行,也会遇到类似的问题,但在这种情况下,用户获得重复的数据(可以说比丢失数据更容易管理,但仍然是一个问题)。
如果您没有对原始数据集进行快照,那么这就是现实。
你可以让用户创建一个显式快照:
POST /createquery
filter.firstName=Bob&filter.lastName=Eubanks
结果:
HTTP/1.1 301 Here's your query
Location: http://www.example.org/query/12345
然后你可以一整天都在上面分页,因为它现在是静态的。这可以是相当轻的重量,因为您可以只捕获实际的文档键,而不是整个行。
如果用例只是你的用户想要(并且需要)所有的数据,那么你可以简单地给他们:
GET /query/12345?all=true
把全套装备都寄过来。