Ruby Net::HTTP suivant des redirections 301
Mes utilisateurs envoyer des url (pour les mélanges sur mixcloud.com) et mon application utilise pour effectuer des requêtes web.
Un bonne url renvoie un code d'état 200:
uri = URI.parse("http://www.mixcloud.com/ErolAlkan/hard-summer-mix/")
request = Net::HTTP.get_response(uri)(
#<Net::HTTPOK 200 OK readbody=true>
Mais si vous avez oublié le slash notre sinon bon url renvoie une 301:
uri = "http://www.mixcloud.com/ErolAlkan/hard-summer-mix"
#<Net::HTTPMovedPermanently 301 MOVED PERMANENTLY readbody=true>
La même chose arrive avec les 404:
# bad path returns a 404
"http://www.mixcloud.com/bad/path/"
# bad path minus trailing slash returns a 301
"http://www.mixcloud.com/bad/path"
- Comment puis-je "descendre" dans la 301 pour voir si il nous prend à une ressource valide ou une page d'erreur?
- Est-il un outil qui fournit un aperçu complet des règles qui un domaine particulier peuvent s'appliquer à leurs urls?
Vous devez vous connecter pour publier un commentaire.
Des redirections 301 sont assez commun, si vous ne tapez pas l'URL exactement comme le serveur web n'attend que ça. Ils se produisent beaucoup plus fréquemment que vous le croyez, vous n'avez tout simplement pas normalement jamais les remarquer lors de la navigation car le navigateur ne prend automatiquement pour vous.
Deux solutions me viennent à l'esprit:
1: Utilisation de
open-uri
open-uri
poignées redirige automatiquement. Donc tout ce que vous devez faire c'est:Si vous avez des problèmes de redirection entre HTTP et HTTPS, alors jetez un oeil ici pour une solution:
Ruby open-uri de redirection interdit
2: Gérer les redirections
Net::HTTP
Si vous voulez être encore plus intelligent, vous pourriez essayer d'ajouter ou de supprimer manquant barres obliques inverses à l'URL lorsque vous obtenez une réponse 404. Vous pouvez le faire en créant une méthode comme
get_response_smart
qui gère cette URL tripoter en plus des redirections.r = get_response_with_redirect(URI.parse(r.header['location']))
Net::HTTPMovedPermanently
, exemple:if r.is_a? Net::HTTPMovedPermanently
.response = open('http://xyz...').read
serait probablement ce que la plupart des gens auront besoin.Je ne peux pas comprendre comment faire des commentaires sur le a accepté de répondre (cette question est peut-être fermé), mais je remarque que
r.header
est maintenant obsolète, doncr.header['location']
devrait être remplacé parr['location']
(par https://stackoverflow.com/a/6934503/1084675 )Voici le code que j'ai est venu avec (dérivé à partir de différents exemples) qui va renflouer si il y a trop de redirections (notez que ensure_success est facultatif):
reste-client
suit les redirections pourGET
etHEAD
demandes sans aucune configuration supplémentaire. Il fonctionne très belle.exemple d'utilisation:
La reste-README du client donne également un exemple de suivre les redirections avec les requêtes POST:
Ne sais pas si quelqu'un est à la recherche de cette solution exacte, mais si vous tentez de télécharger une image http/https et de le stocker dans une variable