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

Ruby on Rails中通过HTTP拉取Zendesk API分页资源的方法

解决Zendesk API多页数据拉取问题

嘿,这个问题我对接Zendesk API时也碰到过!Zendesk API默认每页返回100条数据,要获取全量资源,核心是利用它的分页机制——响应结果里的next_page字段会告诉你下一页数据的请求地址,我们只需要循环请求直到没有下一页为止。

核心思路

Zendesk API的分页响应结构里会包含这些关键字段:

  • next_page: 下一页数据的API地址(如果还有数据则返回URL,否则为null)
  • users: 当前页的用户数据数组
  • count: 资源的总条数(可以用来验证是否拉取完整)

修改后的完整代码

我把你的代码补全并加上分页逻辑,同时补充了Zendesk API必需的认证(这里用推荐的邮箱+API Token认证方式,你需要替换成自己的账号信息):

require 'net/http'
require 'uri'
require 'json'

# 配置Zendesk基础信息
zendesk_subdomain = "samplesupport"
username = "your_zendesk_email@example.com"
api_token = "your_zendesk_api_token"

# 初始化变量存储全量数据
all_users = []
next_page_url = "https://#{zendesk_subdomain}.zendesk.com/api/v2/users.json"

loop do
  # 没有下一页就终止循环
  break if next_page_url.nil?

  uri = URI.parse(next_page_url)
  request = Net::HTTP::Get.new(uri)
  
  # 添加Zendesk API认证头
  request.basic_auth("#{username}/token", api_token)
  request["Accept"] = "application/json"

  # 发起请求
  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
    http.request(request)
  end

  # 处理响应结果
  if response.is_a?(Net::HTTPSuccess)
    data = JSON.parse(response.body)
    # 将当前页用户数据合并到总数组
    all_users.concat(data["users"])
    # 更新下一页请求地址
    next_page_url = data["next_page"]
    # 可选:添加延迟避免触发Zendesk速率限制(默认每分钟200次请求上限)
    sleep 1
  else
    puts "请求失败: #{response.code} #{response.message}"
    break
  end
end

# 现在all_users里就是所有用户数据了
puts "总共拉取到 #{all_users.length} 条用户数据"
# 这里可以添加将数据写入数据库的逻辑

关键注意事项

  • 认证必须正确: Zendesk API强制要求认证,代码里的username和api_token要替换成你自己的真实账号信息,否则会返回401权限错误。
  • 速率限制处理: 如果请求频率过高会触发429限流错误,除了添加sleep,还可以实现重试逻辑(比如遇到429时等待响应头里的Retry-After时间后再重试)。
  • 异常容错: 生产环境中建议补充网络异常、JSON解析失败等场景的处理,避免程序意外崩溃。
  • 数据完整性验证: 可以对比all_users.length和响应里的count字段,确认是否拉取到了全部数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:13:42