Scala调用分页API读取JSON时如何在最后一页正确退出while循环
分页API循环退出逻辑修复方案
原代码存在3个核心问题导致无法正常终止循环、甚至触发请求异常:
- 终止逻辑写反:当接口返回空数据(已经读到最后一页之后)时,反而执行页码+1继续循环,永远不会触发退出
- URL拼接错误:每次循环都在原有url对象上追加参数,第二次请求开始会出现重复的pageNumber、pageSize参数,导致接口参数解析错误
- 无异常兜底:如果接口返回空字符串,代码不会做任何页码变更,会直接陷入死循环
修正后的可运行代码如下:
var pageNumber = 1 val pageSize = 1000 // 提前提取固定参数的基础URL,避免循环内重复拼接 val baseUrl = url.concat("OWNER_MI_KEY&dataset_version=v1.1") while (true) { println("当前请求页码:$pageNumber") // 每次请求基于基础URL拼接当前页参数,不会出现参数重复问题 val requestUrl = "$baseUrl&pageNumber=$pageNumber&pageSize=$pageSize" val apiResponse = MakePostHttpRestCalls(requestUrl) // 接口返回空响应直接终止,避免死循环 if (apiResponse.isBlank()) { println("接口返回空响应,终止分页") break } println("接口响应获取成功") val apiJson = parseApiResponse(apiResponse) println("解析后响应数据:$apiJson") // 返回空数组说明没有更多数据,直接退出 if (apiJson.length == 0) { println("无剩余数据,退出循环") break } // 此处编写当前页数据的业务处理逻辑 // handlePageData(apiJson) // 当前页数据量小于设定的页大小,说明是最后一页,处理完直接退出 if (apiJson.length < pageSize) { println("已读取到最后一页,退出循环") break } // 存在下一页,页码自增进入下一次循环 pageNumber++ }
补充说明:
- 如果你对接的API响应里自带
totalPages(总页数)、hasNext(是否有下一页)这类字段,优先使用接口返回的字段做终止判断,准确率比靠数据长度判断更高 - 建议给HTTP请求增加超时、异常重试逻辑,避免网络波动导致程序卡死
内容的提问来源于stack exchange,提问作者Tito Lulu
相关产品推荐
相关产品推荐

