我正在尝试实现一个 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 的工作方式,我想知道是否有解决这个问题的设计模式?