Cómo seguir una redirección HTTP en el nodo.js?


Quiero abrir una página en el nodo y procesar el contenido en mi aplicación. Algo como esto parece funcionar bien:

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

Esto no funciona, sin embargo, si la página devuelve un redireccionamiento 301/302. ¿Cómo haría eso de una manera reutilizable en caso de que haya múltiples redirecciones? ¿Hay un módulo wrapper encima del http para manejar más fácilmente el procesamiento de respuestas http desde una aplicación de nodo?

Author: hippietrail, 2011-09-06

5 answers

¿Hay un módulo wrapper encima del http para manejar más fácilmente el procesamiento de respuestas http desde una aplicación de nodo?

request

Lógica de redirección en request

 39
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-24 12:55:18

Si todo lo que desea hacer es seguir redirecciones pero aún desea usar los módulos HTTP y HTTPS integrados, le sugiero que use https://github.com/olalonde/follow-redirects .

Todo lo que necesita hacer es reemplazar:

var http = require('http');

Por

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

... y todas sus solicitudes seguirán automáticamente redirecciones.

Divulgación: Yo escribí este módulo.

 77
Author: Olivier Lalonde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-28 19:51:30

Actualización:

Ahora puedes seguir todas las redirecciones con var request = require('request'); usando el parámetro followAllRedirects.

request({
  followAllRedirects: true,
  url: url
}, function (error, response, body) {
  if (!error) {
    console.log(response);
  }
});
 22
Author: skozz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-23 11:18:45

Hacer otra solicitud basada en 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);
 5
Author: Nakilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-20 01:46:33

Si tiene un servidor https, cambie su url para usar el protocolo https://.

Me metí en un problema similar con este. Mi url tiene el protocolo http:// y quiero hacer una solicitud POST, pero el servidor quiere redirigirla a https. Lo que sucede es que, resulta ser el comportamiento http del nodo envía la solicitud de redirección (siguiente) en el método GET que no es el caso.

Lo que hice fue cambiar mi url al protocolo https:// y funciona.

 1
Author: Kevin F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-26 09:35:27