You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:15:39