nodejs 代理请求 转发http

1 篇文章 0 订阅
本文介绍了如何使用Node.js创建一个简单的HTTP代理服务器,通过Express和request模块转发请求,并处理POST请求。同时,展示了如何解决跨域问题,允许来自任何源的请求。代码经过本地测试,适用于代理AJAX请求,但可能需要根据实际接口需求进行调整。
摘要由CSDN通过智能技术生成

 一、简介,用nodejs实现简单的http代理案例

步骤1:新建文件夹、在当前路径打开命令行输入 npm init 回车初始化项目,然后就有了 package.json 文件

步骤2:安装express,搭建简易服务器

安装express:npm i express -S

安装完成后,新建 index.js 文件,代码如下:

const express = require('express');
const app = express();
const port = 3000;    //端口号

//监听请求 *代表所有的请求路径。
//也可指定请求路径,如/text,则只能接收http://localhost:3000/text的请求
app.get('*', (req, res) => {
  res.send('Hello World!');
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

  然后命令行执行 node index.js, 看到打印 Example app listening at http://localhost:3000,就说明服务已经跑起来了

  在浏览器访问 http://localhost:3000,看到 Hello World!,说明运行的服务收到请求并且正常返回结果了

步骤3:使用request模块转发http请求,得到结果并返回

安装request:npm i request -S

const express = require('express');
const app = express();
const port = 3000;    //端口号
const request = require('request');

//监听请求 *代表所有的请求路径。
//也可指定请求路径,如/text,则只能接收http://localhost:3000/text的请求
app.get('*', (req, res) => {
  //接收要转发的http地址
  let url = req.url.substr(1);
  if(url.startsWith('http')){
    const options = {
      url,
      method:"GET",
      //headers: req.headers    //如果需要设置请求头,就加上
    }
    request(options, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        //拿到实际请求返回的响应头,根据具体需求来设置给原来的响应头
        let headers = response.headers;
        res.setHeader('content-type',headers['content-type']);
        res.send(body);
      } else {
        res.send(options);
      }
    });
  }
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

在命令行重新运行 index.js,ctrl + c 终止运行再 node index.js 。

然后在浏览器访问 http://localhost:3000/https://www.baidu.com/,看到 百度搜索的界面,说明代理请求成功了 

到了这里,相信读者应该可以看出具体用法了,http://localhost:3000/https://www.baidu.com/后面红色部分就是具体要转发的请求

需要注意的是,这个代码是用来代理ajax请求的,像上面的例子请求的是百度的界面,这个是为了测试,有些网页可能无法打开。

还有就是,需要根据你的实际情况来修改,比如你请求的接口需要修改请求头如content-type之类的

 步骤4:代理post请求

前面只实现了get请求代理,要代理post请求还需要安装一个模块(body-parser)来获取请求体

安装body-parser: npm i body-parser -S

const express = require('express');
const app = express();
const port = 3000;    //端口号
const request = require('request');
var bodyParser = require('body-parser')
//只要加入这个配置,在req请求对象上会多出来一个属性
//parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
//parse application/json
app.use(bodyParser.json())

//监听请求 *代表所有的请求路径。
//也可指定请求路径,如/text,则只能接收http://localhost:3000/text的请求
app.get('*', (req, res) => {
  //接收要转发的http地址
  let url = req.url.substr(1);
  if(url.startsWith('http')){
    const options = {
      url,
      method:"GET",
      //headers: req.headers    //如果需要设置请求头,就加上
    }
    request(options, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        //拿到实际请求返回的响应头,根据具体需求来设置给原来的响应头
        let headers = response.headers;
        res.setHeader('content-type',headers['content-type']);
        res.send(body);
      } else {
        res.send(options);
      }
    });
  }
})

app.post('*', (req, res) => {
  console.log(req.headers)
  console.log(req.body)
  let url = req.url.substr(1);
  if(url.startsWith('http')){
    const options = {
      url,
      method: 'POST',
      json: req.body,    //content-type是application/json的时候使用,其它请查看requiest用法
      headers: {
        token: req.headers.token,
        'content-type': req.headers['content-type']
      }
    }
    request(options, function (error, response, body) {
      console.log(body,response,error)
      if (!error) {
        let headers = response.headers;
        res.setHeader('content-type',headers['content-type']);
        // for(let key in headers){
        //   res.setHeader(key,headers[key]);
        // }
        console.log(body)
        res.send(body);
      } else {
        res.send(options);
      }
    });
  }
  // res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

重新运行 index.js 就可以代理post请求了,用postMan测试通过

同样需要注意的是请求头和响应头,以及参数的传递

本案例是经过本地测试过的,但是毕竟接口要求可能不一样,所以有些需要修改才能使用

步骤5:如果遇到跨域 

加入以下代码允许跨域

// 允许跨域
app.all('*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", '*');
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  res.header("Access-Control-Allow-Credentials","true");
  if(req.method === "OPTIONS") res.send(200);
  else  next();
});

完整代码:

const express = require('express');
const app = express();
const port = 3000;    //端口号
const request = require('request');
var bodyParser = require('body-parser')
//只要加入这个配置,在req请求对象上会多出来一个属性
//parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
//parse application/json
app.use(bodyParser.json())

// 允许跨域
app.all('*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", '*');
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  res.header("Access-Control-Allow-Credentials","true");
  if(req.method === "OPTIONS") res.send(200);
  else  next();
});

//监听请求 *代表所有的请求路径。
//也可指定请求路径,如/text,则只能接收http://localhost:3000/text的请求
app.get('*', (req, res) => {
  //接收要转发的http地址
  let url = req.url.substr(1);
  if(url.startsWith('http')){
    const options = {
      url,
      method:"GET",
      //headers: req.headers    //如果需要设置请求头,就加上
    }
    request(options, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        //拿到实际请求返回的响应头,根据具体需求来设置给原来的响应头
        let headers = response.headers;
        res.setHeader('content-type',headers['content-type']);
        res.send(body);
      } else {
        res.send(options);
      }
    });
  }
})

app.post('*', (req, res) => {
  console.log(req.headers)
  console.log(req.body)
  let url = req.url.substr(1);
  if(url.startsWith('http')){
    const options = {
      url,
      method: 'POST',
      json: req.body,    //content-type是application/json的时候使用,其它请查看requiest用法
      headers: {
        token: req.headers.token,
        'content-type': req.headers['content-type']
      }
    }
    request(options, function (error, response, body) {
      console.log(body,response,error)
      if (!error) {
        let headers = response.headers;
        res.setHeader('content-type',headers['content-type']);
        // for(let key in headers){
        //   res.setHeader(key,headers[key]);
        // }
        console.log(body)
        res.send(body);
      } else {
        res.send(options);
      }
    });
  }
  // res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

 

Node.js中进行网络请求时,可以使用http_proxy来代理请求http_proxy是一个用于发送HTTP请求代理服务器,它既可以用于转发请求到目标服务器,也可以用于缓存响应等操作。 在使用http_proxy发送网络请求前,需要先安装相应的模块。常用的模块有http-proxy和request-promise。安装命令分别为: ```shell npm install http-proxy npm install request-promise ``` 安装完成后,可以根据需要选择合适的模块进行使用。 使用http-proxy模块的示例代码如下: ```javascript const httpProxy = require('http-proxy'); // 创建代理服务器 const proxy = httpProxy.createProxyServer({}); // 监听目标服务器的响应 proxy.on('proxyRes', (proxyRes, req, res) => { console.log('Received response from target server'); }); // 监听客户端请求 const server = require('http').createServer((req, res) => { // 设置目标服务器地址 const targetUrl = 'http://example.com'; // 发送代理请求 proxy.web(req, res, { target: targetUrl }); }); // 启动代理服务器 server.listen(3000, () => { console.log('Proxy server is running on port 3000'); }); ``` 以上代码创建了一个代理服务器,监听本地的3000端口。当收到客户端的请求时,将请求转发给指定的目标服务器,然后将目标服务器的响应返回给客户端。 如果想要进行更高级的网络请求操作,可以使用request-promise模块。示例代码如下: ```javascript const request = require('request-promise'); async function makeRequest() { const targetUrl = 'http://example.com'; // 发送代理请求 const response = await request.get({ url: targetUrl, proxy: 'http://proxy.example.com:8080' // 设置代理服务器地址 }); console.log(response); } makeRequest(); ``` 以上代码使用request-promise模块发送了一个GET请求,并设置了代理服务器地址。 总结来说,Node.js中可以使用http_proxy来实现网络请求代理功能,可以根据需求选择合适的模块进行使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值