Цикл последовательных запросов к API в Ruby

Стоит задача найти среди значений, отдаваемых сервисом по API, определенное - проблема в том, что в запросе отдается максимум 5000 значений, и в связи с этим необходимо совершать несколько последовательных запросов, подставляя ID последнего элемента в запросе в тело запроса начиная со второго запроса. Решил попробовать использовать while, но на втором запросе получаю ошибку "C:/Ruby32-x64/lib/ruby/3.2.0/net/http/generic_request.rb:111:in `set_body_internal': both of body argument and HTTPRequest#body set (ArgumentError)". Код, который использую (основная часть):

        while is_finded == false do
            response = http.request(req, body.to_json)
            result = JSON.parse(response.body)['result']
            if result != ""
                for hash in result do
                    if hash['value'] == brand
                        is_finded = true
                        break
                    else
                        if hash == result[-1] && JSON.parse(response.body)['has_next'] == true
                            body["last_value_id"] = hash["id"]
                        end
                    end
                end
            else
                break
                puts "result == null"
            end
        end

Пока не могу понять, в чем может быть дело(


Ответы (1 шт):

Автор решения: undefined_xii

Нашел решение. Помогла передача тела запроса в объект класса Post, а не в сам HTTP-запрос через метод request вместе с Post-запросом, но так как тело меняется с каждой итерацией цикла, поместил его передачу в сам цикл.

Итоговый код цикла:

    req = Net::HTTP::Post.new(uri.path, headers)
            while is_finded == false do
                req.body = body.to_json
                response = http.request(req)
                result = JSON.parse(response.body)['result']
                has_next = JSON.parse(response.body)['has_next']
                for hash in result do
                    if hash['value'] == brand || hash['value'].upcase == brand.upcase || hash['value'].downcase == brand.downcase
                        is_finded = true
                        break
                    else
                        if hash == result[-1] && has_next
                            body["last_value_id"] = hash["id"]
                        end
                    end
                end
                break if !has_next
            end

→ Ссылка