Цикл последовательных запросов к 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 шт):
Нашел решение. Помогла передача тела запроса в объект класса 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