我正在尝试实现一个REST API端点,该端点将返回一组实体,可以选择使用各种查询参数进行过滤。由于结果集可能很大,因此端点还将使用limit
和offset
查询参数来支持分页。
该实现似乎非常简单,除了在分页请求序列中修改合格实体的情况之外,在这种情况下,某些实体可能对客户端不可见。
这是一个演示问题的例子。
想象一个返回发票实体的端点,可以选择按其付款状态过滤发票实体。我们发出未付款发票的请求,该请求自然会返回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的工作方式,所以我想知道是否存在一种解决该问题的设计模式?
答案 0 :(得分:1)
通常,项目是按某种东西排序的,让我们以标题为准。然后,您可以将偏移量替换为previousTitle
,并让API返回其后的所有(最多limit
个)项。