使用Stripe API时如何判断当前列表分页是否存在上一页?
Stripe 列表分页判断上一页存在性的方案(适配 stripe-dotnet 库)
首先明确Stripe官方的分页字段定义:
has_more字段用于标识当前返回集合之后是否还有更多可用元素。若该值为false,则当前集合已经是列表的末尾。
Stripe原生未提供标识当前集合之前是否存在元素的返回字段,可通过以下两种方案实现判断,适配stripe-dotnet的调用逻辑:
方案1:本地游标栈记录(推荐,无额外接口开销)
这是官方推荐的前端交互场景最优解:
- 首次加载第一页数据时,默认不存在上一页,直接禁用「上一页」按钮
- 每次触发「下一页」加载新数据前,将当前页首个对象的ID存入本地的游标历史栈
- 只要游标历史栈长度大于0,就说明存在可返回的上一页,激活「上一页」按钮
- 触发「上一页」操作时,从栈顶取出对应游标作为
EndingBefore参数调用列表接口,同时弹出栈顶元素即可
方案2:轻量反向查询(适合无需维护本地状态的场景)
如果不希望本地存储分页状态,可以通过一次极轻量的接口查询校验上一页是否存在:
- 取当前返回列表第一个元素的ID,构造一个新的查询请求,将
Limit设为1,EndingBefore设为上述ID - 若该请求返回的列表长度大于0,说明存在上一页,否则不存在
stripe-dotnet 代码示例
以查询Customer列表为例:
// 初始化服务 var customerService = new CustomerService(); // 你当前的分页查询逻辑 var listOptions = new CustomerListOptions { Limit = 20, // 下一页传StartingAfter参数,上一页传EndingBefore参数 StartingAfter = currentPageCursor }; var currentPage = await customerService.ListAsync(listOptions); // 判断是否存在上一页的逻辑 bool hasPreviousPage = false; if (currentPage.Data.Any()) { var checkPrevOptions = new CustomerListOptions { Limit = 1, EndingBefore = currentPage.Data.First().Id }; var checkPrevResult = await customerService.ListAsync(checkPrevOptions); hasPreviousPage = checkPrevResult.Data.Any(); }
注意事项
- 反向查询将Limit设为1即可,请求资源消耗极低,几乎不会占用Stripe接口配额
- 若业务允许优先选择方案1,无需额外接口调用,性能更高
内容的提问来源于stack exchange,提问作者Vladyslav Kalashnikov
相关产品推荐
相关产品推荐

