Getting all the pages from an API

Viewed 274

This is something I struggle with, or whenever I do it it seems to be messy. I'm going to ask the question in a very generic way as it's not a single problem I'm really trying to solve.

I have an API that I want to consume some data from, e.g. via:

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

When I call it I can retrieve a total.

results["total"] = 237

The API limits the number of records I can retrieve in one call, say 20. So I need to call it a few more times.

I want to do something like the following, ideally breaking it into pieces so I can use things like 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

I always feel like I'm writing rubbish whenever I try and solve this (and I've tried to solve it in a number of ways). The above, for example, leaves me at the mercy of an error with the API, which knocks out all my collected results if I hit an error at any point.

Wondering if there is just a generally good, clean way of dealing with this situation.

1 Answers
Related