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
相关产品推荐
相关产品推荐

