Nodejs通过代理(proxy)发送http请求(request)

Nodejs通过代理(proxy)发送http请求(request)

有可能有这样的需求,需要node作为web服务器通过另外一台http/https代理服务器发http或者https请求,废话不多说直接上代码大家都懂的:

var http = require('http')
var opt = {
 host:'这里放代理服务器的ip或者域名',
 port:'这里放代理服务器的端口号',
 method:'POST',//这里是发送的方法
 path:' https://www.google.com',     //这里是访问的路径
 headers:{
  //这里放期望发送出去的请求头
 }
}
//以下是接受数据的代码
var body = '';
var req = http.request(opt, function(res) {
  console.log("Got response: " + res.statusCode);
  res.on('data',function(d){
  body += d;
 }).on('end', function(){
  console.log(res.headers)
  console.log(body)
 });

}).on('error', function(e) {
  console.log("Got error: " + e.message);
})
req.end();

这样我们就通过了指定代理服务器发出了https的请求,注意这里我们同代理服务器是http协议的,不是https,返回的结果当然肯定会根据你的代理服务器不同有所不同。

Got response: 302
{ location: 'https://www.google.com.tw/',
  'cache-control': 'private',
  'content-type': 'text/html; charset=UTF-8',
  'set-cookie': 
   [ 'PREF=ID=b3cfcb24798a7a07:FF=0:TM=1356078097:LM=1356078097:S=v_3qEd0_gCW6-xum; expires=Sun, 21-Dec-2014 08:21:37 GMT; path=/; domain=.google.com',
     'NID=67=qoJf_z3W7KlibpNZ6xld__r0rYGyYu7l_XiDQmZ3anjBFadDzhijME3QcX651yucne_irK_2JMS8HF5FuxNl85mE0nDrtn9Iq0z2gW69n00OrB970hpHTbYe0mAogZit; expires=Sat, 22-Jun-2013 08:21:37 GMT; path=/; domain=.google.com; HttpOnly' ],
  p3p: 'CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."',
  date: 'Fri, 21 Dec 2012 08:21:37 GMT',
  server: 'gws',
  'content-length': '223',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'SAMEORIGIN',
  via: '1.0 ***.****.com:80 (squid/2.6.STABLE21)',
  'proxy-connection': 'keep-alive' }
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.com.tw/">here</A>.
</BODY></HTML>

谷歌返回了一个302,告诉我们进行跳转,需要访问 https://www.google.com.tw/ 这个地址

博客原文:http://snoopyxdy.blog.163.com/blog/static/60117440201211214207539/


11 回复

Node.js 通过代理(Proxy)发送 HTTP 请求

在某些情况下,你可能需要通过代理服务器来发送 HTTP 或 HTTPS 请求。例如,当你的网络环境需要通过代理才能访问外部服务时。本文将展示如何使用 Node.js 通过代理服务器发送 HTTP 请求。

示例代码

首先,你需要安装 http(s) 模块以及 proxy-agent 模块,后者可以帮助你配置代理服务器。

npm install proxy-agent

接下来,你可以使用以下代码通过代理服务器发送 HTTP 请求:

const http = require('http');
const { HttpsProxyAgent } = require('proxy-agent');

// 配置代理服务器
const proxyServer = 'http://your-proxy-server:port';

// 目标 URL
const targetUrl = 'https://www.google.com';

// 设置代理
const agent = new HttpsProxyAgent(proxyServer);

// HTTP 请求选项
const options = {
    hostname: new URL(targetUrl).hostname,
    port: 443,
    path: '/',
    method: 'GET',
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    },
    agent: agent // 使用代理
};

// 发送 HTTP 请求
const req = http.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(`Response status code: ${res.statusCode}`);
        console.log('Headers:', res.headers);
        console.log('Data:', data);
    });
});

req.on('error', (error) => {
    console.error(`Request error: ${error.message}`);
});

req.end();

代码解释

  1. 引入模块

    • http 模块用于处理 HTTP 请求。
    • proxy-agent 模块用于设置代理服务器。
  2. 配置代理服务器

    • proxyServer 变量存储代理服务器的 URL 和端口。
  3. 目标 URL

    • targetUrl 是你要访问的目标网站的 URL。
  4. 设置代理

    • 创建一个 HttpsProxyAgent 实例,并将其传递给 options 中的 agent 属性。
  5. HTTP 请求选项

    • hostnameport 用于指定目标服务器。
    • path 指定请求的路径。
    • method 指定请求方法(如 GETPOST)。
    • headers 包含请求头信息。
  6. 发送 HTTP 请求

    • 使用 http.request 方法发起请求。
    • 监听响应数据并打印出来。

通过这种方式,你可以轻松地通过代理服务器发送 HTTP 请求。希望这对你有所帮助!


是不是这样就可以实现goagent的功能了?

我想知道能否实现这样的功能:

内网机器A, 外网服务器B. 第三方服务C

A先登录到B, 然后建立管道, 反向代理. C访问B,然后B把request转发给A, 处理后回复给C

就是node作为客户端,通过代理发送http请求了

可以的,这样服务器B就是一个代理服务器

node-http-proxy , 这个包用起来更方便~~~

好像不同吧,这个node-http-proxy是让node作为代理服务器,可以正向反向代理,而本文写的是node作为客户端,通过其他的代理服务器发送http请求,是这样吧?

你好,请问下一,要是爬取youtube的话,我的返回是空的,输出内容如下:

Got response: 301
{ 'cache-control': 'no-cache',
  'content-type': 'text/html; charset=utf-8',
  date: 'Sun, 09 Jul 2017 03:55:52 GMT',
  expires: 'Tue, 27 Apr 1971 19:44:06 EST',
  'keep-alive': 'timeout=38',
  location: 'https://www.youtube.com/feed/trending',
  server: 'YouTubeFrontEnd',
  'x-content-type-options': 'nosniff',
  'x-xss-protection': '1; mode=block; report=https://www.google.com/appserve/security-bugs/log/youtube',
  'content-length': '0' }

我的代码是这样的

var http = require('http')

var opt = { host:‘127.0.0.1’, port:‘57939’, method:‘GET’,//这里是发送的方法 path:‘https://www.youtube.com/feed/trending’,//这里是访问的路径 headers:{ //这里放期望发送出去的请求头 ‘Content-Type’: ‘application/x-www-form-urlencoded’ } } //以下是接受数据的代码 var body = ‘’; var req = http.request(opt, function(res) { console.log("Got response: " + res.statusCode); res.on(‘data’,function(d){ body += d; }).on(‘end’, function(){ console.log(res.headers) console.log(body) });

}).on(‘error’, function(e) { console.log("Got error: " + e.message); }) req.end();

七年前的帖子,mark一下

为了通过代理服务器发送HTTP或HTTPS请求,可以使用http(s)模块结合代理配置。以下是一个使用Node.js通过代理服务器发送HTTP请求的示例:

示例代码

const http = require('http');
const https = require('https');
const { Agent } = require('http');

// 定义代理服务器信息
const proxyAgent = new Agent({
    host: 'your-proxy-host',
    port: 'your-proxy-port',
});

// 定义目标服务器的信息
const options = {
    agent: proxyAgent,
    hostname: 'www.google.com',
    port: 443,
    path: '/',
    method: 'GET',
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    },
};

// 发送HTTPS请求
https.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(`Response: ${data}`);
    });
}).on('error', (err) => {
    console.error(`Error: ${err.message}`);
}).end();

解释

  1. 代理设置:创建一个Agent实例,并传递代理服务器的主机名和端口。
  2. 选项配置:在请求选项中设置代理代理器,并指定目标服务器的详细信息(如主机名、端口、路径等)。
  3. 发送请求:使用https.request方法发起请求,并处理响应。

这段代码通过指定的代理服务器发送一个HTTPS GET请求到www.google.com。代理服务器用于中间传输请求和响应数据。如果需要发送HTTP请求,只需将https替换为http即可。

回到顶部