Получить перенаправление URL в Ruby - PullRequest
25 голосов
/ 03 мая 2011

В соответствии с API графа Facebook мы можем запросить изображение профиля пользователя с этим (пример):

https://graph.facebook.com/1489686594/picture

Но реальный URL изображения предыдущей ссылки:

http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg

Если вы введете первую ссылку в браузере, она перенаправит вас на вторую ссылку.

Есть ли способ получить полный URL (вторая ссылка) в Ruby / Rails, зная только первый URL?

(это повторение этого вопроса , но для Ruby)

Ответы [ 6 ]

37 голосов
/ 02 мая 2014

На этот вопрос уже ответили правильно, но есть гораздо более простой способ:

res = Net::HTTP.get_response(URI('https://graph.facebook.com/1489686594/picture'))
res['location']
13 голосов
/ 03 мая 2011

Вы можете использовать Net :: Http и прочитать заголовок Location: из ответа

require 'net/http'
require 'uri'

url = URI.parse('http://www.example.com/index.html')
res = Net::HTTP.start(url.host, url.port) {|http|
  http.get('/index.html')
}
res['location']
9 голосов
/ 03 мая 2011

У вас есть URL-адреса HTTPS, так что вы справитесь с этим ...

require 'net/http'
require 'net/https' if RUBY_VERSION < '1.9'
require 'uri'

u = URI.parse('https://graph.facebook.com/1489686594/picture')

h = Net::HTTP.new u.host, u.port
h.use_ssl = u.scheme == 'https'

head = h.start do |ua|
  ua.head u.path
end

puts head['location']
3 голосов
/ 29 октября 2015

Я знаю, что это старый вопрос, но я добавлю этот ответ для потомков:

Большинство решений, которые я видел, следуют только за одним перенаправлением.В моем случае мне пришлось выполнить несколько перенаправлений, чтобы получить фактический конечный URL-адрес назначения.Я использовал Curl (через Curb gem ) примерно так:

result = Curl::Easy.perform(url) do |curl|
  curl.head = true
  curl.follow_location = true
end
result.last_effective_url
2 голосов
/ 08 мая 2017

Вы можете проверить код состояния ответа и рекурсивно получить окончательный URL-адрес, используя метод get_final_redirect_url:

  require 'net/http'

  def get_final_redirect_url(url, limit = 10)
    uri = URI.parse(url)
    response = ::Net::HTTP.get_response(uri)
    if response.class == Net::HTTPOK
      return uri
    else
      redirect_location = response['location']
      location_uri = URI.parse(redirect_location)
      if location_uri.host.nil?
        redirect_location = uri.scheme + '://' + uri.host + redirect_location
      end
      warn "redirected to #{redirect_location}"
      get_final_redirect_url(redirect_location, limit - 1)
    end
  end

Я столкнулся с той же проблемой. Я решил это и построил вокруг него гем final_redirect_url , чтобы каждый мог получить от него пользу.

Подробную информацию об использовании можно найти здесь .

0 голосов
/ 23 июня 2011

Да, в заголовке ответа "Location" указан фактический URL изображения.

Однако, если вы используете изображение в качестве изображения профиля пользователя на своем сайте, я рекомендую вам использовать URL-адрес в стиле "https://graph.facebook.com/:user_id/picture" вместо реального URL-адреса изображения. В противном случае ваши пользователи увидят много «не найденных» изображений или устаревших изображений профиля в будущем.

Вы просто добавили "https://graph.facebook.com/:user_id/picture"" в качестве атрибута "src" тега "img". В них браузер получает обновленное изображение пользователя.

пс. У меня такие проблемы на моем сайте с Twitter и Yahoo! OpenID сейчас ..

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