2013-05-22 8 views
44

Ich versuche, auf eine URL zu folgen, die mich zu einer anderen Seite umleitet, die den Knoten request module verwendet.Wie bekomme ich die umgeleitete URL aus dem Nodejs-Request-Modul?

Durch die Dokumente kämmt konnte ich nichts finden, das mir die URL nach der Weiterleitung abrufen kann.

Mein Code ist 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); 

}); 

Antwort

46

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

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

Die URI ist ein Objekt. uri.href enthält die URL mit Abfrageparametern als Zeichenfolge.

Der Code stammt von einem Kommentar zu einer Github Ausgabe von Schöpfer Anfrage: 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); 
}); 

Dies wird http://www.google.com/?q=foo dreimal drucken (beachten Sie, dass wir mit www auf eine Adresse umgeleitet wurden aus eins ohne).

+0

Sie sagten, dass der obige Code dreimal umleitet, woher weiß ich, welcher Lauf die letzte Iteration ist? – hitautodestruct

+1

Es wird nicht dreimal umgeleitet. Er gibt die URL, auf die Sie umgeleitet wurden, auf drei verschiedene Arten aus. Entschuldigung, wenn das unklar war. – gabrielf

+1

@gabrielf, Nein 'this', weil wir' es6' verwenden könnten. –

5

request bekommt Umleitungen standardmäßig, kann es bis 10 Umleitungen standardmäßig erhalten. Sie können dies in der docs überprüfen. Der Nachteil davon ist, dass Sie nicht wissen würden, ob die URL, die Sie erhalten, eine umgeleitete oder eine ursprüngliche Standardoption ist.

Zum Beispiel:

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

gibt Ausgang

> { 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 geben followRedirect als falsch

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> 

Also mach dir keine Sorgen um den umgeleiteten Inhalt. Aber wenn Sie wissen wollen, ob es umgeleitet wird oder nicht, setzen Sie followRedirect false und überprüfen Sie den location Header in der Antwort.

+0

ich deinen letzten Satz „nicht verstehen, wenn Sie wollen wissen, wenn es umgeleitet wird set 'followRedirect' auf' false' "? Würde das den Umleitungsprozess nicht stoppen? – hitautodestruct

+0

Standardmäßig erhalten Sie keine 3xx-Antwort wegen der automatischen Umleitung. Wenn Sie also wissen möchten, dass Sie umgeleitet wurden/nicht umleiten wollen, müssen Sie es als falsch angeben. Es dient nur dazu, die Umleitung herauszufinden. – user568109

+0

Fragen Sie sich, wurden Sie umgeleitet oder nicht (wie in der Einleitung)? Sie müssen wissen, was Sie bekommen, ist eine Weiterleitung (aka Traumwelt) oder direkte Seite (oder Realität). Es ist dein Totem;) – user568109

22

Um die Umleitungs-URL versuchen, dies zu finden:

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

Beendet hier nach der Suche nach "folgen Sie nicht Weiterleitungen in Anfrage in Knoten" also danke! Ich war mir nicht sicher, wie ich diese Option einbeziehen sollte. – araneae

+5

'res.headers.location' hat die Aufgabe für mich erledigt. – Felix

+2

Funktioniert möglicherweise nicht wie erwartet, wenn mehrere Weiterleitungen beteiligt sind, die die erste und nicht die letzte Weiterleitung enthalten. – Crazometer

0

Sie die Funktion Form für followRedirects verwenden können, wie folgt aus:

options.followRedirects = 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

Dies scheint nicht richtig in 'Anfrage 2.75.0' zu funktionieren – loretoparisi

Verwandte Themen