如何防止REST API结果集中的页面数据移位

时间:2018-06-20 06:28:03

标签: rest data-paging

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

该实现似乎非常简单,除了在分页请求序列中修改合格实体的情况之外,在这种情况下,某些实体可能对客户端不可见。

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

想象一个返回发票实体的端点,可以选择按其付款状态过滤发票实体。我们发出未付款发票的请求,该请求自然会返回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 API是无状态的。如果服务器可以在第一个请求期间对结果集进行快照,并在后续请求期间重新使用快照,则不会发生此问题。但是由于这不是REST的工作方式,所以我想知道是否存在一种解决该问题的设计模式?

1 个答案:

答案 0 :(得分:1)

通常,项目是按某种东西排序的,让我们以标题为准。然后,您可以将偏移量替换为previousTitle,并让API返回其后的所有(最多limit个)项。