REST 架构中的分页
Pagination in REST architecture
假设我们有一个端点return一个用户列表,列表可以分页
/users?offset=20&limit=10
当用户总数小于 offset 时 return 怎么办?空列表、错误或...?
我们还应该 return 响应的用户总数吗?或者这应该是另一个端点?
我会 return 一个空数组。 URL 在技术上并没有错。也方便客户处理此类情况。
我还会 return 一些关于响应的元数据,包括 returned 项目的总数和客户端可以从中请求下一组结果的 URL .
示例:
"meta": {
"cursor": {
"current": "0",
"next": "20",
"count": 20,
"next_url": "/items?cursor=20&limit=20"
}
}
我会确保客户端使用 URL 而不是尝试解析偏移量并自行计算下一个 URL。这将使它更加灵活,并允许您稍后更改实施细节。
例如,如果您使用偏移值为 SQL 数据库构建 OFFSET
查询,如果数据库变得非常大,您可能希望稍后更改实现,并使用更有效的抵消。例如,如果您的项目始终按时间排序,您可以更改 API 以输出时间戳作为偏移量。这可能允许更有效的查询。
如果下一个 URL 为空,则客户端无需尝试获取更多项目。但是,如果下一个 URL 存在,根据您的实现,可能仍然没有更多结果(很难计算大型数据库中的总结果数,在这种情况下您不知道总数提前)。
假设我们有一个端点return一个用户列表,列表可以分页
/users?offset=20&limit=10
当用户总数小于 offset 时 return 怎么办?空列表、错误或...?
我们还应该 return 响应的用户总数吗?或者这应该是另一个端点?
我会 return 一个空数组。 URL 在技术上并没有错。也方便客户处理此类情况。
我还会 return 一些关于响应的元数据,包括 returned 项目的总数和客户端可以从中请求下一组结果的 URL .
示例:
"meta": {
"cursor": {
"current": "0",
"next": "20",
"count": 20,
"next_url": "/items?cursor=20&limit=20"
}
}
我会确保客户端使用 URL 而不是尝试解析偏移量并自行计算下一个 URL。这将使它更加灵活,并允许您稍后更改实施细节。
例如,如果您使用偏移值为 SQL 数据库构建 OFFSET
查询,如果数据库变得非常大,您可能希望稍后更改实现,并使用更有效的抵消。例如,如果您的项目始终按时间排序,您可以更改 API 以输出时间戳作为偏移量。这可能允许更有效的查询。
如果下一个 URL 为空,则客户端无需尝试获取更多项目。但是,如果下一个 URL 存在,根据您的实现,可能仍然没有更多结果(很难计算大型数据库中的总结果数,在这种情况下您不知道总数提前)。