gpt4 book ai didi

ruby-on-rails - 从 API 获取所有页面

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:27 24 4
gpt4 key购买 nike

这是我一直在努力解决的问题,或者每当我这样做时,它似乎都是一团糟。我将以一种非常通用的方式提出这个问题,因为这不是我真正要解决的单一问题。

我有一个 API,我想从中使用一些数据,例如通过:

def get_api_results(page)
results = HTTParty.get("api.api.com?page=#{page}")
end

当我调用它时,我可以检索总数。

results["total"] = 237

API 限制了我在一次调用中可以检索的记录数,比如 20。所以我需要多调用几次。

我想做类似下面的事情,理想情况下将它分成几部分,这样我就可以使用诸如 delayed_job..etc 之类的东西

def get_all_api_pages
results = get_api_results(1)
total = get_api_results(1)["total"]

until page*20 > total do |p|
results += get_api_results(p)
end
end

每当我尝试解决这个问题时,我总是觉得我在写垃圾(而且我已经尝试通过多种方式解决它)。例如,上面的内容让我任由 API 错误的摆布,如果我在任何时候遇到错误,它会破坏我收集的所有结果。

想知道是否有一种总体上好的、干净的方法来处理这种情况。

最佳答案

我不认为你可以有那么多清洁...因为你只有在调用 API 后才会收到总数。您是否尝试为此构建自己的枚举。它封装了丑陋的部分。下面是一些带有“模拟”API 的示例代码:

class AllRecords
PER_PAGE = 50

def each
return enum_for(:each) unless block_given?
current_page = 0
total = nil
while total.nil? || current_page * PER_PAGE < total
current_page += 1
page = load_page(current_page)
total = page[:total]
page[:items].each do |item|
yield(item)
end
end
end

private

def load_page(page)
if page == 5
{items: Array.new(37) { rand(100) }, total: 237}
else
{items: Array.new(50) { rand(100) }, total: 237}
end
end
end

AllRecords.new.each.each_with_index do |item, index|
p index
end

你当然可以稍微清理一下,但我认为这很好,因为它不会先收集所有项目。

关于ruby-on-rails - 从 API 获取所有页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com