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

Ruby解析分页接口数据时如何将循环请求次数限制为最多10次

分页请求次数限制实现方案

要实现无论接口是否返回continuation分页标识,最多发起10次分页请求的逻辑,只需要在原有循环基础上增加请求次数计数器,把次数阈值加入循环终止判断即可,不需要重构整体逻辑,修改后的完整实现如下:

def load_items
  base_url = "https://api.test.com/data#{self.account_address}"
  url = base_url
  max_request_times = 10
  current_request_count = 0

  # 循环终止条件:无下一页地址 / 请求次数达到10次上限
  while url.present? && current_request_count < max_request_times do
    response = HTTParty.get(url, timeout: 180, open_timeout: 1200, read_timeout: 120)
    # 兼容接口异常返回无items字段的场景,避免报错中断
    items = response.dig('items') || []
    
    items.each do |item_data|
      next if self.items.exists?(item_id: item_data['id'])
      begin
        Item.new(
          item_id: item_data['id'],
          title: item_data['title']
        ).upsert
      rescue => e
        # 可按需增加错误日志打印,不要空吞异常方便排查问题
        Rails.logger.error("Item upsert failed, id: #{item_data['id']}, error: #{e.message}") if defined?(Rails)
      end
    end

    current_request_count += 1
    # 达到最大请求次数时直接置空url终止循环,不再读取下一页标识
    url = if current_request_count >= max_request_times
            nil
          elsif response['continuation'].present?
            "#{base_url}&continuation=#{response['continuation']}"
          else
            nil
          end
  end
end

如果偏好使用until循环实现,只需要把循环判断条件取反即可:until url.blank? || current_request_count >= max_request_times,和上述while实现的执行逻辑完全一致,不存在功能差异。

关键改动点

  • 新增current_request_count计数器,每完成1次请求就累加1次计数,计数阈值固定为10次
  • 循环判断条件新增次数校验,只要计数达到上限就直接退出循环,完全不受接口返回的continuation字段影响
  • 把接口基础地址抽为单独变量,避免重复拼接相同字符串
  • 补全接口返回异常时的空值兼容逻辑,避免响应无items字段时触发NoMethodError中断整个流程
  • 原空rescue块补充可选的错误日志打印逻辑,避免异常被完全吞掉后难以排查问题

内容的提问来源于stack exchange,提问作者Anton Ipatov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:12:59