Comment obtenir 302 emplacement redirect dans Rails? (Ont essayé HTTParty, Net / Http et RedirectFollower)
-
09-10-2019 - |
Question
Bonjour
Je suis en train d'obtenir l'image de couverture de l'album de l'utilisateur Facebook.
comme il est dit dans la page de l'API, il renvoie « HTTP 302 avec l'URL de l'image de couverture de l'album » lors de l'obtention:
http s: //graph.facebook.com/ [album_id]} / image access_token = blahblahblah ...
documents ici: http://developers.facebook.com/docs/reference/api/album
J'ai essayé HTTParty, Net: HTTP et aussi la classe RedirectFollower
HTTParty renvoie l'image de l'image elle-même, et non « emplacement » (URL) des informations partout
NET: HTTP et RedirectFollower sont un peu délicat ...
si je ne l'utilise URI.encode lors du passage de l'URL dans la méthode get, il provoque
d'erreur « mauvais uri »
mais si j'utilise URI.encode pour passer l'URI codé, il provoque EOFError (fin de fichier atteint)
Ce qui est étonnant est que je peux voir l'URL d'emplacement lorsque vous utilisez l'API FB de Apigee
ici est la méthode de redirection qui est recommandé sur le Net: documents HTTP:
tout devrait être modifié? ou est-il un moyen plus facile de le faire?
Thank you !!
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
La solution 2
Voici ce que je retrouve avec après quelques essais et erreurs:
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]
les regards header_str retournés comme
"HTTP bla bla bla Lieu: http: //xxxxxxx/xxxx.jpg bla bla bla"
donc je réussi à obtenir l'URL en utilisant 2 split ()
le résultat final est une URL propre
aussi le curl.follow_location doit être faux il ne retournera pas le corps de cette page
Autres conseils
Si vous ne me dérange pas l'aide d'un bijou, curb
le fera pour vous. Il est tout au sujet de l'aide du paramètre 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
Ce n'est pas la seule bibliothèque avec cette fonctionnalité, cependant.
Comme une note, plusieurs fois, vous obtiendrez un emplacement non valide dans l'en-tête et il devra être interprété par l'agent utilisateur pour le rendre en quelque chose d'utile. Un en-tête comme Location: /
devra être ré-écrit avant qu'il puisse être tiré par les cheveux. D'autres fois, vous obtiendrez un en-tête comme Location: uri=...
et vous devrez tirer sur l'emplacement à partir de là. Il est vraiment préférable de le laisser à votre bibliothèque que ré-écriture vous-même.