web-dev-qa-db-fra.com

Comment suivez-vous une redirection HTTP dans Node.js?

Je veux ouvrir une page dans le noeud et traiter le contenu de 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
  });

Toutefois, cela ne fonctionne pas si la page renvoie une redirection 301/302. Comment pourrais-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 noeud? 

60
Zach

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 noeud?

request

Logique de redirection dans la demande

41
Raynos

Si tout ce que vous voulez, c'est suivre les redirections tout en utilisant les modules HTTP et HTTPS intégrés, je vous suggère d'utiliser https://github.com/follow-redirects/follow-redirects .

yarn add follow-redirects
npm install follow-redirects

Tout ce que vous avez à faire est de remplacer:

var http = require('http');

avec

var http = require('follow-redirects').http;

... et toutes vos demandes suivront automatiquement les redirections.

Divulgation: j'ai écrit ce module.

82
Olivier Lalonde

Mettre à jour:  

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

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

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);
10
Nakilon

Voici la fonction que j'utilise pour récupérer l'URL contenant la 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 comme http.get mais suivez la redirection.

1
jcubic

Si vous avez un serveur https, changez votre URL pour utiliser le protocole https://.

J'ai eu un problème similaire avec celui-ci. Mon URL a le protocole http:// et je souhaite effectuer une demande POST, mais le serveur souhaite la rediriger vers https. En réalité, le comportement du nœud http envoie la demande de redirection (suivant) dans la méthode GET, ce qui n’est pas le cas.

Ce que j'ai fait est de changer mon URL en protocole https:// et cela fonctionne.

0
Kevin F.

En cas de PUT ou de POST Request. si vous recevez statusCode 405 ou si la méthode n'est pas autorisée. Essayez cette implémentation avec la bibliothèque "request" et ajoutez les propriétés mentionnées.
followAllRedirects: true,
followOriginalHttpMethod: true

       const options = {
           headers: {
               Authorization: TOKEN,
               'Content-Type': 'application/json',
               'Accept': 'application/json'
           },
           url: `https://${url}`,
           json: true,
           body: payload,
           followAllRedirects: true,
           followOriginalHttpMethod: true
       }

       console.log('DEBUG: API call', JSON.stringify(options));
       request(options, function (error, response, body) {
       if (!error) {
        console.log(response);
        }
     });
}
0
Sanjeet kumar