Wie erhalte ich die umgeleitete URL vom NodeJS-Anforderungsmodul?

73

Ich versuche, eine URL zu verwenden, die mich mithilfe des Anforderungsmoduls von nodejs auf eine andere Seite weiterleitet .

Beim Durchsuchen der Dokumente konnte ich nichts finden, mit dem ich die URL nach der Umleitung abrufen könnte.

Mein Code lautet wie folgt:

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

});
hitautodestruct
quelle

Antworten:

79

Es gibt zwei sehr einfache Möglichkeiten, um die letzte URL in einer Reihe von Weiterleitungen zu erhalten.

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

Der Uri ist ein Objekt. uri.href enthält die URL mit Abfrageparametern als Zeichenfolge.

Der Code stammt aus einem Kommentar des Erstellers der Anfrage zu einem Github-Problem: https://github.com/mikeal/request/pull/220#issuecomment-5012579

Beispiel:

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

Dadurch wird http://www.google.com/?q=foo dreimal gedruckt (beachten Sie, dass wir von einer ohne Adresse an eine Adresse mit www weitergeleitet wurden).

gabrielf
quelle
1
Sie sagten, dass der obige Code dreimal umleitet. Woher weiß ich, welcher Lauf die letzte Iteration ist?
Hitautodestruct
1
Es wird nicht dreimal umgeleitet. Die URL, zu der Sie umgeleitet wurden, wird auf drei verschiedene Arten gedruckt. Entschuldigung, wenn das unklar war.
Gabrielf
1
@gabrielf, nein this, weil wir vielleicht verwenden es6.
Gaurav Gandhi
2
res.request.uri.hrefstürzt ab, wenn die angegebene URL eine schlechte URL wie 'sdfdsfdgdfgdfgdfg.sdfsdfsdf' ist. Sie können also entweder prüfen, ob Sie diese Option verwenden möchten erroder resnicht.
Sumit Kumar
33

Um die Weiterleitungs-URL zu finden, versuchen Sie Folgendes:

var url = 'http://www.google.com';
request({ url: url, followRedirect: false }, function (err, res, body) {
  console.log(res.headers.location);
});
Michael
quelle
Ich bin hier gelandet, nachdem ich nach "Verfolgen Sie keine Weiterleitungen auf Anfrage im Knoten" gesucht habe. Vielen Dank! Ich war mir nicht sicher, wie ich diese Option einschließen sollte.
Araneae
8
res.headers.locationhat den Job für mich gemacht.
Felix
5
Funktioniert möglicherweise nicht wie erwartet, wenn mehrere Weiterleitungen beteiligt sind, sodass die erste und nicht die letzte Weiterleitung erfolgt.
Crazometer
6

requestErhält standardmäßig Weiterleitungen, kann standardmäßig 10 Weiterleitungen durchlaufen. Sie können dies in den Dokumenten überprüfen . Der Nachteil dabei ist, dass Sie nicht wissen, ob es sich bei der erhaltenen URL um eine umgeleitete oder eine ursprüngliche URL handelt.

Zum Beispiel:

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

gibt Ausgabe

> { 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' }

aber wenn Sie Option followRedirectals falsch geben

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

es gibt

> { 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>

Machen Sie sich also keine Sorgen um den umgeleiteten Inhalt. Wenn Sie jedoch wissen möchten, ob es umgeleitet wird oder nicht, setzen followRedirectSie den locationHeader in der Antwort.

user568109
quelle
Ich verstehe Ihren letzten Satz nicht "Wenn Sie wissen möchten, ob er umgeleitet ist, setzen Sie followRedirectauf false"? Würde das nicht den Umleitungsprozess stoppen?
Hitautodestruct
Standardmäßig erhalten Sie aufgrund der automatischen Umleitung keine 3xx-Antwort. Wenn Sie also wissen möchten, dass Sie umgeleitet wurden / nicht umleiten möchten, müssen Sie dies als falsch angeben. Es dient nur dazu, die Umleitung herauszufinden.
user568109
1
Fragen Sie sich, wurden Sie umgeleitet oder nicht (wie zu Beginn)? Sie müssen wissen, was Sie erhalten, ist eine Weiterleitung (auch bekannt als Traumwelt) oder eine direkte Seite (oder Realität). Es ist dein Totem;)
user568109
0

Sie können das Funktionsformular für followRedirect(anstatt followAllRedirects) wie folgt verwenden:

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
});
Flimm
quelle