97 votes

Comment suivre une redirection HTTP dans Node.js ?

Je souhaite ouvrir une page dans node et traiter le contenu dans mon application. Quelque chose comme ça semble bien fonctionner :

 var opts = {host: host, path:pathname, port: 80};
http.get(opts, function(res) {
  var page = '';
  res.on('data', function (chunk) {
    page += chunk;
  });
  res.on('end', function() {
     // process page
  });

Cependant, cela ne fonctionne pas si la page renvoie une redirection 301/302. Comment puis-je le faire de manière réutilisable au cas où il y aurait plusieurs redirections ? Existe-t-il un module wrapper au-dessus de http pour gérer plus facilement le traitement des réponses http à partir d'une application de nœud ?

48voto

Raynos Points 82706

Existe-t-il un module wrapper au-dessus de http pour gérer plus facilement le traitement des réponses http à partir d'une application de nœud ?

request

Logique de redirection dans la requête

26voto

skozz Points 393

Mettre à jour:

Vous pouvez maintenant suivre toutes les redirections avec var request = require('request'); utilisant le paramètre followAllRedirects .

 request({
  followAllRedirects: true,
  url: url
}, function (error, response, body) {
  if (!error) {
    console.log(response);
  }
});

24voto

Nakilon Points 11635

Faites une autre demande basée sur response.headers.location :

       const request = function(url) {
        lib.get(url, (response) => {
          var body = [];
          if (response.statusCode == 302) {
            body = [];
            request(response.headers.location);
          } else {
            response.on("data", /*...*/);
            response.on("end", /*...*/);
          };
        } ).on("error", /*...*/);
      };
      request(url);

6voto

jcubic Points 11141

Voici la fonction que j'utilise pour récupérer l'URL qui a une redirection :

 const http = require('http');
const url = require('url');

function get({path, host}, callback) {
    http.get({
        path,
        host
    }, function(response) {
        if (response.headers.location) {    
            var loc = response.headers.location;
            if (loc.match(/^http/)) {
                loc = new Url(loc);
                host = loc.host;
                path = loc.path;
            } else {
                path = loc;
            }
            get({host, path}, callback);
        } else {
            callback(response);
        }
    });
}

cela fonctionne de la même manière que http.get mais suivez la redirection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X