【问题标题】:How to keep paginated data on sync with the backend?如何保持分页数据与后端同步?
【发布时间】:2019-03-30 23:52:11
【问题描述】:

我正在构建一个 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 栋建筑。

有谁知道正确处理这个问题的方法吗?我使用的一些解决方案暗示使用套接字消息在客户端刷新这些更改。但是,这仍然不是最好的解决方案。

我希望我说清楚了,如果我遗漏了什么,请随时向我寻求反馈。

谢谢

【问题讨论】:

    标签: android rest pagination synchronization


    【解决方案1】:

    改变资源的语义可能会简化你的生活。

    GET /building?&status=free&from=1&to=5
    

    这是描述一组固定项目的单个资源,这些项目可能存在也可能不存在,具体取决于它们是否满足过滤器。下一页是

    GET /building?&status=free&from=6&to=10
    

    等等。

    Working with timelines 描述了一个类似的想法,使用一个 id 和一个计数

    GET /building?&status=free&max_id=5&count=5
    GET /building?&status=free&max_id=10&count=5
    

    【讨论】:

    • 嘿,这实际上是一个很好的解决方案,并且拥有像 Twitter 这样的知名平台实施它是一个可靠解决方案的标志。我只是想让这篇文章保持开放一段时间,以防有人发布有用的东西。但到目前为止,我认为,这是要走的路。谢谢!
    • 已接受答案,我认为我们将采用这种方式,并使用 websockets 与后端的任何更改保持同步。通常我已经看到要走的路是使用 Firebase 来保持所有客户端(移动、Web 平台等)同步,但这需要现在进行重大重构。感谢您的信息。
    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2014-08-20
    • 2017-07-04
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多