工作生活

nodejs做http请求转发,解决js跨域问题(二)

2019-07-01  本文已影响0人  嗷大喵

上篇讲了nodejs做http请求转发,解决js跨域问题(二)
现在遇到一个问题,公司的服务器防火墙针对User-Agent做了拦截。需要特定的User-Agent才能访问到API接口
如果用上篇的方法js的ajax请求目前在很多浏览器中是无法修改User-Agent,这样的话导致api请求可能无法成功。

我们可以在nodejs这一层加入请求修改User-Agent,不仅仅可以在nodejs这一层代理修改User-Agent,还可以修改request和response
例如
下面就修改了request的headers 添加了mytest=0000000000000和User-Agent= mytest
也修改了request里面的body给body添加了Type : 'jpg'以及修改了FileName : '2.jpg'
一定要注意如果修改了requestbody值一定要重新设置Content-Length

response原本是返回一个json{"ID":"1234567890","Name":"张三"},也把这个json改了,改成{"ID":"1234567890","Age":2}

var express = require('express');
var httpProxy = require('http-proxy-middleware');
var app = express();
var path = require('path');
var modifyResponse = require('node-http-proxy-json');
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));

function onProxyRes(proxyRes, req, res) {
    console.log("===============onProxyRes===============");
    //header添加一个addedX
    proxyRes.headers['x-addedX'] = 'xxxx';
    modifyResponse(res, proxyRes, function (body) {
        if (body) {
            body.Age = 2;
            delete body.Name;
        }
        return body; // return value can be a promise
    });
}

function onProxyReq(proxyReq, req, res) {
    // add custom header to request 
    console.log("===============onProxyReq===============");
    proxyReq.setHeader('mytest', '0000000000000');
    proxyReq.setHeader('User-Agent', 'mytest');
    // proxyReq.setHeader('Content-Type', 'application/json');
    if ( req.method == "POST" && req.body ) {
        var body =  req.body;
        var filename = req.body.FileName;
        filename = "2.jpg";
        body.FileName = filename;
        body.Type = "jpg";
        var bodyData = JSON.stringify(req.body);
        proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
        proxyReq.write(bodyData);
        proxyReq.end();

        // const contentType = proxyReq.getHeader('Content-Type');
        // const writeBody = (bodyData) => {
        //     proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
        //     proxyReq.write(bodyData);
        // };

        // if (contentType === 'application/json') {
        //     writeBody(JSON.stringify(req.body));
        // }

        // if (contentType === 'application/x-www-form-urlencoded') {
        //     writeBody(querystring.stringify(req.body));
        // }
    }
}

var targetUrl = "http://127.0.0.1:5000/";
var options = {
    target: targetUrl, // target host 
    changeOrigin: true, 
    // preserveHeaderKeyCase:true,
    onProxyReq: onProxyReq,
    onProxyRes: onProxyRes
};

var proxy = httpProxy(options);
app.use('/Image/*', proxy);
app.use('/Account/*', proxy);

app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname, 'public/index.html'));
});

app.listen(3000);
上一篇 下一篇

猜你喜欢

热点阅读