Как получить 302 Место перенаправления в рельсах? (Пробовали httparty, net/http и redirectfollower)

StackOverflow https://stackoverflow.com/questions/4379700

Вопрос

Привет
Я пытаюсь получить обложку альбома пользователя 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=... И вам придется вытащить место оттуда. Действительно лучше оставить это в вашу библиотеку, чем переписать это самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top