上篇讲了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'
一定要注意如果修改了request
的body
值一定要重新设置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);
网友评论