我如何使用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://github.com/nodejitsu/node-http-proxy,因为这可能会阐明如何使用你的应用程序与http。客户。;
基于这个线程的答案,看起来你可以使用代理链来通过代理服务器运行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/