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 );
});
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).
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);
});
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.
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
});