我如何使用http代理与node.js http.Client?

我想使用标准的http.Client从node.js发出一个传出的HTTP调用。 但我无法直接从我的networking到达远程服务器,需要通过代理。

如何告诉node.js使用代理?

Tim Macfarlane的回答很接近于使用HTTP代理。

使用HTTP代理(对于非安全请求)非常简单。 连接到代理并正常发出请求,不同之处在于path部分包含完整的url,并将主机头设置为要连接的主机。
Tim的回答非常接近,但他错过了正确设置主机头。

 var http = require("http"); var options = { host: "proxy", port: 8080, path: "http://www.google.com", headers: { Host: "www.google.com" } }; http.get(options, function(res) { console.log(res); res.pipe(process.stdout); }); 

logging他的答案确实与http://nodejs.org/工作,但这是因为他们的服务器不关心主机头是不正确的。;

你可以使用请求 ,我发现在node.js上使用代理非常容易,只需要一个外部的“proxy”参数,甚至可以通过一个http代理来支持HTTPS。

 var request = require('request'); request({'url':'https://anysite.you.want/sub/sub', 'proxy':'http://yourproxy:8087'}, function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body); } }) 

有一件事花了我一段时间才弄清楚,使用'http'来访问代理,即使你想通过https服务器进行代理。 这对我使用查尔斯(OSX协议分析仪)的作品:

 var http = require('http'); http.get ({ host: '127.0.0.1', port: 8888, path: 'https://www.google.com/accounts/OAuthGetRequestToken' }, function (response) { console.log (response); }); 

正如@Renat在这里已经提到的,代理HTTPstream量进来非常正常的HTTP请求。 向代理发送请求,传递目标的完整URL作为path。

 var http = require ('http'); http.get ({ host: 'my.proxy.com', port: 8080, path: 'http://nodejs.org/' }, function (response) { console.log (response); }); 

'请求'http包似乎有这个function:

https://github.com/mikeal/request

例如,下面的'r'请求对象使用localproxy来访问它的请求:

 var r = request.defaults({'proxy':'http://localproxy.com'}) http.createServer(function (req, resp) { if (req.url === '/doodle.png') { r.get('http://google.com/doodle.png').pipe(resp) } }) 

不幸的是没有“全局”的默认值,所以使用这个库的用户不能修改代理,除非lib通过http选项…

HTH,Chris

以为我会添加这个模块,我发现: https : //www.npmjs.org/package/global-tunnel ,这对我很好(立即与我所有的代码和第三方模块,只有下面的代码工作)。

 require('global-tunnel').initialize({ host: '10.0.0.10', port: 8080 }); 

这样做一次,并且应用程序中的所有http(和https)都通过代理。

或者,打电话

 require('global-tunnel').initialize(); 

将使用http_proxy环境variables

基本上你不需要明确的代理支持。 代理协议非常简单,基于普通的HTTP协议。 与HTTPClient连接时,您只需使用您的代理主机和端口。 示例(来自node.js文档):

 var http = require('http'); var google = http.createClient(3128, 'your.proxy.host'); var request = google.request('GET', '/', {'host': 'www.google.com'}); request.end(); ... 

所以基本上你连接到你的代理,但请求“http://www.google.com”。;

节点应该支持使用http_proxy环境variables – 所以它是跨平台的,并且在系统设置上工作,而不是要求每个应用程序的configuration。

使用提供的解决scheme,我会build议如下:

CoffeeScript的

 get_url = (url, response) -> if process.env.http_proxy? match = process.env.http_proxy.match /^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i if match http.get { host: match[2], port: (if match[4]? then match[4] else 80), path: url }, response return http.get url, response 

使用Javascript

 get_url = function(url, response) { var match; if (process.env.http_proxy != null) { match = process.env.http_proxy.match(/^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i); if (match) { http.get({ host: match[2], port: (match[4] != null ? match[4] : 80), path: url }, response); return; } } return http.get(url, response); }; 

用法要使用该方法,只需要replacehttp.get,例如下面的代码将google的索引页写入名为test.htm的文件:

 file = fs.createWriteStream path.resolve(__dirname, "test.htm") get_url "http://www.google.com.au/", (response) -> response.pipe file response.on "end", -> console.log "complete" 

如果您需要使用代理服务提供商的基本授权,请使用以下内容:

 var http = require("http"); var options = { host: FarmerAdapter.PROXY_HOST, port: FarmerAdapter.PROXY_PORT, path: requestedUrl, headers: { 'Proxy-Authorization': 'Basic ' + new Buffer(FarmerAdapter.PROXY_USER + ':' + FarmerAdapter.PROXY_PASS).toString('base64') } }; var request = http.request(options, function(response) { var chunks = []; response.on('data', function(chunk) { chunks.push(chunk); }); response.on('end', function() { console.log('Response', Buffer.concat(chunks).toString()); }); }); request.on('error', function(error) { console.log(error.message); }); request.end(); 

Imskull的答案几乎为我工作,但我不得不做一些改变。 唯一真正的变化是添加用户名,密码,并将rejectUnauthorized设置为false。 我不能评论,所以我把这个答案。

如果你运行这个代码,它将会为你提供Hacker News上的当前故事的标题,按照这个教程: http : //smalljs.org/package-managers/npm/

 var cheerio = require('cheerio'); var request = require('request'); request({ 'url': 'https://news.ycombinator.com/', 'proxy': 'http://Username:Password@YourProxy:Port/', 'rejectUnauthorized': false }, function(error, response, body) { if (!error && response.statusCode == 200) { if (response.body) { var $ = cheerio.load(response.body); $('td.title a').each(function() { console.log($(this).text()); }); } } else { console.log('Error or status not equal 200.'); } }); 

http://groups.google.com/group/nodejs/browse_thread/thread/d5aadbcaa00c3f7/12ebf01d7ec415c3?lnk=gst&q=proxy#12ebf01d7ec415c3

基于这个线程的答案,看起来你可以使用代理链来通过代理服务器运行node.js:
$ proxychains /path/to/node application.js

就我个人而言,我无法在Cygwin / Windows环境中安装任何代理链版本,因此无法对其进行testing。

此外,他们还谈到了使用连接代理,但我找不到任何文件如何做到这一点。

总之,我仍然坚持,但也许有人可以使用这个信息find一个合适的解决办法。

对于使用HTTPS的代理,我尝试了在这个网站上的build议(使用依赖的HTTPS代理代理 ),它为我工作:

http://codingmiles.com/node-js-making-https-request-via-proxy/