Swift中如何实现基于nextPage字段判断的API分页请求逻辑
基于nextPage标记的游标分页实现方案
核心逻辑流程
整个逻辑不需要提前知道总页数,完全靠接口返回的nextPage字段控制终止,执行步骤如下:
- 初始化状态:设置初始请求页码为字符串类型的
"1",准备空数组存储所有拉取到的数据 - 进入循环逻辑:只要当前待请求的页码值存在,就发起对应地址的请求
- 处理当前页响应:拿到响应后第一时间将当前页返回的所有数据条目存入总结果集,避免数据遗漏
- 游标判断:检查当前响应体中是否存在
nextPage字段- 若存在:直接取该字段的字符串值作为下一轮请求的页码,拼接成新的请求地址,进入下一轮循环
- 若不存在:将待请求页码置为空,终止循环,此时总结果集里就是所有分页的数据
注意事项
几个容易出问题的点提前规避:
- 接口返回的
page和nextPage本身就是String类型,不需要额外做数字类型转换,直接拼接到URL末尾即可,减少不必要的类型转换报错- 禁止硬编码总页数(比如当前场景是2页就写死请求2次),否则后续接口总页数变更时逻辑会直接失效
- 必须先存储当前页数据再判断下一页游标,否则最后一页(也就是没有nextPage的那一页)的数据会被漏掉
代码参考(通用伪代码,可直接对应到你用的编程语言)
// 基础配置 const basePath = ".../listing/"; // 初始页码为字符串类型的1,和接口字段类型保持一致 let currentPage = "1"; const totalResult = []; async function loadAllListData() { // 只要有有效页码就持续请求 while (currentPage) { // 拼接当前页请求地址 const requestUrl = `${basePath}${currentPage}`; // 发起请求,替换成你实际项目里的请求方法即可 const response = await fetch(requestUrl); const responseBody = await response.json(); // 先存当前页的数据,注意把dataList替换成你接口实际返回数据列表的字段名 totalResult.push(...responseBody.dataList); // 检查下一页游标,没有nextPage就把currentPage置为falsy值终止循环 currentPage = responseBody.nextPage || null; } return totalResult; } // 调用方法即可拿到全量分页数据 loadAllListData().then(allData => { console.log("拉取到的全量数据:", allData); });
对应当前场景的执行验证
- 第一次循环:请求
.../listing/1,拿到20条数据存入结果,检测到nextPage值为"2",更新currentPage为"2",继续循环 - 第二次循环:请求
.../listing/2,拿到该页数据存入结果,检测到响应中无nextPage字段,更新currentPage为null,循环终止,最终拿到两页的全部数据
内容的提问来源于stack exchange,提问作者İstemihan Çelik
相关产品推荐
相关产品推荐

