Скорее всего, вам нужно будет следовать перенаправлению (302
код). Ruby docs имеет прекрасный пример для этого.
Я включил это ниже вместе с проверкой, чтобы вернуть тело, если оно существует. Если вы никогда не хотите следовать перенаправлению, вы можете изменить условие else
, чтобы оно возвращало response.code
, и пустую строку, false или любое другое подходящее значение. Вот полный пример:
def fetch(uri_str, limit = 10)
raise ArgumentError, 'too many HTTP redirects' if limit == 0
response = Net::HTTP.get_response(URI(uri_str))
case response
when Net::HTTPSuccess then
response
when Net::HTTPRedirection then
if response.body_permitted?
response
else
location = response['location']
warn "redirected to #{location}"
fetch(location, limit - 1)
end
else
response.value
end
end
Код довольно прост, рекурсивно вызывает себя, если код из Net::HTTP.get_response
возвращает перенаправление, указывающее на новое местоположение.
При таком подходе вы можете выполнить до десяти переадресаций, которых должно быть достаточно, хотя, скорее всего, они должны соответствовать требованиям или обстоятельствам.
Затем, когда вы запускаете fetch(your_url)
, он должен следовать за перенаправлением, пока не попадет на страницу и не сможет вернуть тело. И.Е.
res = fetch(your_url)
res.body
Дайте мне знать, как вы справляетесь с этим, или если у вас есть какие-либо вопросы!