2011-09-06 154 views
52

我想在节点中打开一个页面并处理我的应用程序中的内容。像这样的东西似乎工作得很好:你如何遵循Node.js中的HTTP重定向?

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

但是,如果页面返回301/302重定向,这不起作用。如果有多个重定向,我该如何以可重用的方式来做到这一点?在http上面是否有一个包装模块可以更轻松地处理来自节点应用程序的http响应处理?

回答

36

在http的顶部是否有一个包装模块,可以更轻松地处理来自节点应用程序的http响应处理?

request

Redirection logic in request

+9

为什么生活b'jesus是不是这部分内置的HTTP模块? – aaaidan

+1

它是。它被称为'http.request',这个API非常简单。 – Raynos

+3

是否有可能以某种方式为每个重定向进行回调?我想存储请求经过的每一个URL。无法在文档中找到它。 – Ignas

67

如果你想要做的就是按照重定向,但仍想使用内置的HTTP和HTTPS模块,我建议你使用https://github.com/olalonde/follow-redirects

所有你需要做的是更换:

var http = require('http'); 

通过

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

...和你所有的请求都将自动执行重定向。

披露:我写了这个模块。

+2

作为一种魅力工作,就像上面提到的那样简单。 – viion

+0

现在这里是:https:// github。COM /请求/请求/ BLOB/d18cb487cf4e02740778d4bb464b5a1c7441d800/lib中/ redirect.js#L46 –

+1

是否使用HTTPS工作? – 2016-05-23 19:15:01

18

更新:

现在你可以按照所有使用followAllRedirects PARAM var request = require('request');重定向。

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

是这个完整的代码?您的变种是'http'但你使用一个叫做功能'request' – jcollum

+5

你不能简单地要求(“请求”),这是一个外部模块,需要下载和安装先 - HTTPS://www.npmjs。 COM /包/请求 (NPM安装请求) –

1

如果你有https服务器,改变你的网址使用https://协议。

我遇到了这个类似的问题。我的网址有http://协议,我想提出POST请求,但服务器想将其重定向到https。发生什么呢,原来是node http行为在GET的方法发送重定向请求(next),而不是这种情况。

我所做的是将我的网址更改为https://协议,它的工作原理。

1

使基于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

我不是一个程序员JS所以如果你解释为什么downvote这将是有益的。 – Nakilon