Come ottenere 302 posizione reindirizzamento in Rails? (Hanno provato HTTParty, Rete / HTTP e RedirectFollower)

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

Domanda

Ciao
Sto cercando di ottenere foto di copertina dell'album di Facebook dell'utente.
come si dice nella pagina di API, restituisce "Un HTTP 302 con l'URL della foto di copertina dell'album" quando ottiene:
http s:? //graph.facebook.com/ [album_id]} / immagine access_token = blahblahblah ...
documenti qui: http://developers.facebook.com/docs/reference/api/album

Ho provato HTTParty, Net: HTTP e anche la classe RedirectFollower
HTTParty restituisce l'immagine immagine stessa, e nessun "location" (URL) informazioni ovunque
NET: HTTP e RedirectFollower sono un po 'complicato ...
se io non uso URI.encode quando passa l'URL nel metodo get, provoca "cattivo uri" Errore
ma se io uso URI.encode per passare l'URI codificato, provoca EOFError (fine del file ha raggiunto)
La cosa incredibile è che posso vedere l'URL posizione quando si utilizza l'apigee FB API

Ecco il metodo di reindirizzamento che è raccomandato in Rete: HTTP documenti:
tutto ciò dovrebbe essere modificato? o c'è un modo più semplice per fare questo? grazie !!

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
È stato utile?

Soluzione 2

Ecco quello che ho finire con dopo alcuni tentativi ed errori:

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]

L'aspetto header_str restituiti come
"HTTP bla bla bla Località: http: //xxxxxxx/xxxx.jpg bla bla bla"
così sono riuscito a ottenere l'URL utilizzando 2 split ()
il risultato finale è un ambiente pulito URL
anche il curl.follow_location dovrebbe essere falsa in modo da non restituire il corpo di quella pagina

Altri suggerimenti

Se non ti dispiace utilizzando una gemma, curb farà questo per voi. E 'tutto su come utilizzare il parametro 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

Questa non è l'unica libreria con questa caratteristica, però.

Come nota, molte volte si otterrà una posizione non valida nell'intestazione e dovrà essere interpretato dal programma utente per renderlo in qualcosa di utile. Un colpo di testa come Location: / dovrà essere riscritto prima che possa essere recuperata. Altre volte si otterrà un colpo di testa come Location: uri=... e dovrete tirare fuori la posizione da lì. E 'davvero meglio lasciare alla vostra biblioteca di ri-scrittura che voi stessi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top