web-dev-qa-db-fra.com

Comment puis-je obtenir l'URL redirigée à partir du module de requête nodejs?

J'essaie de suivre une URL qui me redirige vers une autre page en utilisant le nodejs module de requête .

En parcourant la documentation, je n'ai rien trouvé qui me permette de récupérer l'URL après la redirection.

Mon code est le suivant:

var request = require("request"),
    options = {
      uri: 'http://www.someredirect.com/somepage.asp',
      timeout: 2000,
      followAllRedirects: true
    };

request( options, function(error, response, body) {

    console.log( response );

});
63
hitautodestruct

Il existe deux méthodes très simples pour obtenir la dernière URL d'une chaîne de redirections.

var r = request(url, function (e, response) {
  r.uri
  response.request.uri
})

L'uri est un objet. uri.href contient l'URL, avec les paramètres de requête, sous forme de chaîne.

Le code provient d'un commentaire sur un problème github par le créateur de la requête: https://github.com/mikeal/request/pull/220#issuecomment-5012579

Exemple:

var request = require('request');
var r = request.get('http://google.com?q=foo', function (err, res, body) {
  console.log(r.uri.href);
  console.log(res.request.uri.href);

  // Mikael doesn't mention getting the uri using 'this' so maybe it's best to avoid it
  // please add a comment if you know why this might be bad
  console.log(this.uri.href);
});

Cela imprimera http://www.google.com/?q=foo trois fois (notez que nous avons été redirigés vers une adresse avec www de l'un sans).

63
gabrielf

Pour trouver l'URL de redirection, essayez ceci:

var url = 'http://www.google.com';
request({ url: url, followRedirect: false }, function (err, res, body) {
  console.log(res.headers.location);
});
28
Michael

request obtient les redirections par défaut, il peut obtenir 10 redirections par défaut. Vous pouvez vérifier cela dans le docs . L'inconvénient est que vous ne saurez pas si l'URL que vous obtenez est une option redirigée ou originale par défaut.

Par exemple:

request('http://www.google.com', function (error, response, body) {
    console.log(response.headers) 
    console.log(body) // Print the google web page.
})

donne la sortie

> { date: 'Wed, 22 May 2013 15:11:58 GMT',
  expires: '-1',
  'cache-control': 'private, max-age=0',
  'content-type': 'text/html; charset=ISO-8859-1',
  server: 'gws',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'SAMEORIGIN',
  'transfer-encoding': 'chunked' }

mais si vous donnez l'option followRedirect comme fausse

request({url:'http://www.google.com',followRedirect :false}, function (error, response, body) {
    console.log(response.headers) 
    console.log(body)
});

il donne

> { location: 'http://www.google.co.in/',
  'cache-control': 'private',
  'content-type': 'text/html; charset=UTF-8',
  date: 'Wed, 22 May 2013 15:12:27 GMT',
  server: 'gws',
  'content-length': '221',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'SAMEORIGIN' }
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/">here</A>.
</BODY></HTML>

Donc, ne vous inquiétez pas pour obtenir le contenu redirigé. Mais si vous voulez savoir s'il est redirigé ou non, définissez followRedirect false et vérifiez l'en-tête location dans la réponse.

5
user568109

Vous pouvez utiliser le formulaire de fonction pour followRedirect (plutôt que followAllRedirects), comme ceci:

options.followRedirect = function(response) {
  var url = require('url');
  var from = response.request.href;
  var to = url.resolve(response.headers.location, response.request.href);
  return true;
};

request(options, function(error, response, body) {
  // normal code
});
0
Flimm