Как получить 302 Место перенаправления в рельсах? (Пробовали httparty, net/http и redirectfollower)
-
09-10-2019 - |
Вопрос
Привет
Я пытаюсь получить обложку альбома пользователя Facebook.
Как сказано на странице API, он возвращает «HTTP 302 с URL -адресом обложки альбома», когда получает:
http s: //graph.facebook.com/ [Album_id]}/picture? access_token = blahblahblah ...
Документы здесь: http://developers.facebook.com/docs/reference/api/album
Я попробовал httparty, net: http, а также класс redirectfollower
Httparty возвращает саму изображение изображения, и нет «местоположение» (URL) где угодно
Net: http и redirectlower немного сложны ...
Если я не использую uri.encode при передаче URL -адреса в метод получения, это вызывает ошибку «плохой URI»
Но если я использую uri.encode для прохождения закодированного URI, это вызывает эооферрор (достигнут конец файла)
Что удивительно, так это то, что я вижу URL -адрес расположения при использовании API FB APIGEE
Вот метод перенаправления, который рекомендуется в сети: http документы:
Что -нибудь должно быть изменено? Или есть более простой способ сделать это? благодарю вас!!
def self.fetch(uri_str, limit = 10)
response = Net::HTTP.get_response(URI.parse(uri_str))
case response
when Net::HTTPSuccess then response
when Net::HTTPRedirection then fetch(response['location'], limit - 1)
else
response.error!
end
end
Решение 2
Вот с чем я в конечном итоге после некоторой проб и ошибок:
uri_str = URI.encode(https://graph.facebook.com/[album_id]}/picture?access_token=blahblahblah...)
result = Curl::Easy.http_get(uri_str) do |curl|
curl.follow_location = false
end
puts result.header_str.split('Location: ')[1].split(' ')[0]
Возвращенный Header_str выглядит как
"Http Blah Blah Blah Местоположение: http: //xxxxxxxx/xxxx.jpg бла бла бла"
Поэтому мне удалось получить URL, используя 2 Split ()
Окончательный результат - чистый URL
Кроме того
Другие советы
Если вы не против использовать драгоценный камень, curb
сделаю это для вас. Все дело в использовании follow_location
Параметр:
gem 'curb'
require 'curb'
# http://www.stackoverflow.com/ redirects to http://stackoverflow.com/
result = Curl::Easy.http_get("http://www.stackoverflow.com/") do |curl|
curl.follow_location = true
end
puts result.body_str
Это не единственная библиотека с этой функцией, хотя.
В качестве примечания, много раз вы получите недопустимое местоположение в заголовке, и пользователь должен будет интерпретировать его, чтобы превратить его во что -то полезное. Заголовок, как Location: /
нужно будет переписать, прежде чем его можно будет извлечь. В других случаях вы получите как заголовок Location: uri=...
И вам придется вытащить место оттуда. Действительно лучше оставить это в вашу библиотеку, чем переписать это самостоятельно.