Come ottenere 302 posizione reindirizzamento in Rails? (Hanno provato HTTParty, Rete / HTTP e RedirectFollower)
-
09-10-2019 - |
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
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.