我正在构建一个 Android 应用程序,我一直在努力找出使分页数据与后端保持同步的最佳方法。
例如,假设我们有一个 GET/building?&status=free&page=1&size=5
端点。这会获取一组可供租用的“构建”JSON 对象。
响应是这样的:
{
"data": [
{
"id": 1,
"street": "Some street name 1",
"status": "free",
},
{
"id": 2,
"street": "Some street name 2",
"status": "free",
},
{
"id": 3,
"street": "Some street name 3",
"status": "free",
},
{
"id": 4,
"street": "Some street name 4",
"status": "free",
},
{
"id": 5,
"street": "Some street name 5",
"status": "free",
}
],
"metadata": {
"total_pages": 4,
"page_size": 5,
"current_page": 1
}
}
假设您在后端有多达 20 座建筑物可供出租。您刚刚获取了第一页。
您将第四和第五座建筑物标记为“已租用”,因此它们不再可用。假设您通过一些 UI 按钮执行此操作并发送 PUT 请求以更新每个按钮的状态。类似于 PUT/building/4?status="rented"
和 PUT/building/5?status="rented"
后端的记录会变成这样的状态:
1|First Building |Some street|Free
2|Second Building|Some street|Free
3|Third Building |Some street|Free
4|Forth Building |Some street|Rented
5|Fifth Building |Some street|Rented
现在在后端,如果我们查询可用的建筑物,我们有类似的东西:
1|First Building |Some street|Free
2|Second Building |Some street|Free
3|Third Building |Some street|Free
6|Sixth Building |Some street|Free
7|Seventh Building|Some street|Free
现在,如果我们触发相同的请求,但对于第二页,类似 GET/building?&status=free&page=2&size=5
的内容,我们将得到如下内容:
{
"data": [
{
"id": 8,
"street": "Some street name 8",
"status": "free",
},
{
"id": 9,
"street": "Some street name 9",
"status": "free",
},
{
"id": 10,
"street": "Some street name 10",
"status": "free",
},
{
"id": 11,
"street": "Some street name 11",
"status": "free",
},
{
"id": 12,
"street": "Some street name 12",
"status": "free",
}
],
"metadata": {
"total_pages": 4,
"page_size": 5,
"current_page": 2
}
}
因此缺少现在第一页上的第 6 和第 7 栋建筑。
有人知道如何正确处理这个问题吗?我使用的一些解决方案暗示使用套接字消息在客户端刷新这些更改。但仍然不是目前最出色的解决方案。
我希望我说清楚了,如果我遗漏了什么,请随时向我寻求反馈。
谢谢
最佳答案
改变资源的语义可能会简化您的生活。
GET /building?&status=free&from=1&to=5
这是描述一组固定项目的单一资源,这些项目可能存在也可能不存在取决于它们是否满足过滤器。下一页是
GET /building?&status=free&from=6&to=10
等等。
Working with timelines描述了一个类似的想法,使用一个id和一个count
GET /building?&status=free&max_id=5&count=5
GET /building?&status=free&max_id=10&count=5
关于android - 如何保持分页数据与后端同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432124/