如何防止在 REST API 结果集中移动分页数据

How to prevent shifting of paged data in a REST API result set

我正在尝试实现一个 REST API 端点,它将 return 一组实体,可选择使用各种查询参数进行过滤。由于结果集可能很大,端点也将支持分页,使用limitoffset查询参数。

实施看起来非常简单,除了在一系列分页请求期间修改合格实体的情况,在这种情况下,某些实体可能对客户端不可见。

这是一个演示问题的例子。

想象一个 return 发票实体的端点,可选择按其付款状态进行过滤。我们发出未付发票的请求,这自然可能 return 15 个匹配项,但由于每个响应仅限于 5 个实体,因此第一个响应将包含发票 1、2、3、4 和 5。

理论上,第二个请求会检索同一个结果集中的发票6、7、8、9和10。但是,假设发票 3 在发出第二个请求之前已付款。这将导致结果集移动,结果的第一页包含发票 1、2、4、5 和 6。在这种情况下,第二个请求将检索发票 7、8、9、10 和 11。结果客户永远不会看到发票 6。

我不担心发票 3 在请求序列结束之前(在客户端上)过时,因为这是数据更改的自然结果。但是,我担心客户永远不会知道发票 6 的存在,即使它在整个请求序列中一直未支付。

在我看来,出现这个问题是因为 REST APIs 是无状态的。如果服务器可以在第一次请求期间对结果集进行快照并在后续请求期间重新使用该快照,则不会出现该问题。但由于这不是 REST 的工作方式,我想知道是否有一种设计模式可以解决这个问题?

通常项目是按某种东西排序的,我们假设按标题排序。然后你可以用 previousTitle 替换偏移量,并让 API return 所有(最多 limit)在它之后的项目。