2011-09-06 15 views
52

Chcę otworzyć stronę w węźle i przetworzyć zawartość w mojej aplikacji. Coś jak to wydaje się działać dobrze:Jak śledzić przekierowanie HTTP w Node.js?

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

ta nie działa jednak, jeśli strona zwraca 301/302 przekierowanie. Jak mógłbym to zrobić w sposób wielokrotnego użytku na wypadek, gdyby było wiele przekierowań? Czy na wierzchu http znajduje się moduł otoki, który ułatwia przetwarzanie odpowiedzi HTTP z aplikacji węzła?

Odpowiedz

36

Czy na wierzchu http znajduje się moduł otoki, który ułatwia przetwarzanie odpowiedzi HTTP z aplikacji węzła?

request

Redirection logic in request

+9

Dlaczego b'jesus istota nie jest ta część wbudowanego modułu http ?! – aaaidan

+1

To jest. To się nazywa 'http.request' API jest całkiem proste. – Raynos

+3

Czy jest możliwe, aby w jakiś sposób uzyskać wywołanie zwrotne dla każdego przekierowania? Chciałbym przechowywać każdy pojedynczy adres URL, przez który przechodzi zapytanie. Nie można go znaleźć w dokumentach. – Ignas

67

Jeśli wszystko, co chcesz zrobić, to postępować przekierowań, ale nadal chcą korzystać z wbudowanych modułów HTTP i HTTPS, proponuję użyć https://github.com/olalonde/follow-redirects.

Wszystko, co musisz zrobić, to wymienić:

var http = require('http'); 

przez

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

... a wszystkie wnioski zostaną automatycznie przekierowań.

Ujawnienie: Napisałem ten moduł.

+2

Pracował jako urok, był tak prosty jak wpadnięcie, jak wspomniano. – viion

+0

To jest teraz tutaj: https: // github.com/request/request/blob/d18cb487cf4e02740778d4bb464b5a1c7441d800/lib/redirect.js # L46 –

+1

Czy to działa z HTTPS? –

18

Aktualizacja:

Teraz możesz śledzić wszystkie przekierowania z var request = require('request'); pomocą followAllRedirects param.

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

to jest kompletny kod? twój var to 'http', ale wtedy używasz funkcji o nazwie' request' – jcollum

+5

, której nie możesz po prostu wymagać ('request'), jest to moduł zewnętrzny i musi najpierw zostać pobrana i zainstalowana - https: //www.npmjs. com/package/request (żądanie instalacji npm) –

1

Jeśli masz serwer https, zmienić swój adres, aby używać protokołu https://.

Mam podobny problem z tym. Mój adres URL ma protokół http:// i chcę wykonać żądanie POST, ale serwer chce przekierować go pod numer https. Co się dzieje, to okazuje się, że zachowanie węzła http wysyła żądanie przekierowania (następne) w metodzie GET, co nie jest prawdą.

To, co zrobiłem, to zmienić mój adres URL na https:// i działa.

1

dokonać innego wniosku w oparciu o 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); 
+0

Nie jestem programistą JS, więc byłoby przydatne, gdybyś wyjaśnił, dlaczego w dół. – Nakilon

Powiązane problemy