Как получить 302 места перенаправления в Rails?(пробовал HTTParty, Net / Http и RedirectFollower) - PullRequest
2 голосов
/ 07 декабря 2010

Hello
я пытаюсь получить обложку альбома пользователя 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 и RedirectFollower немного сложнее ...
если я не использую URI.encode при передаче URL-адреса в метод get, это вызывает ошибку «bad uri»
но если я использую URI.encode для передачи закодированного URI, это вызывает EOFError (достигнут конец файла)
Что удивительно, так это то, что я могу видеть URL местоположения при использовании API FB API 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 ]

2 голосов
/ 08 декабря 2010

вот что я получаю после проб и ошибок:

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 бла-бла-бла Местоположение: http://xxxxxxx/xxxx.jpg бла-бла-бла"
так что мне удалось получить URL с помощью 2 split ()
окончательный результат - чистый URL
также curl.follow_location должен быть false, чтобы он не возвращал тело этой страницы

2 голосов
/ 07 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...