在转发到代理目标并将响应发送回客户端之前,编辑POST参数
Edit POST parameters prior to forwarding to a proxy target and sending response back to client
我有一个node/express代理设置,使用http代理中间件将请求路由到java tomcat web服务(代理目标)。
在将请求转发到代理目标之前,我需要将POST表单数据注入到上下文类型为"application/x-www-form-urlencoded"的请求rawbody中。在向客户端发送响应之前,代理响应将需要删除相同的post参数。
我使用了许多不同的代理,包括http代理、http代理中间件、节点代理和express代理,但这些模块似乎都没有允许POST参数操作的解决方案
这个问题最初发布在https://github.com/chimurai/http-proxy-middleware/issues/61#issuecomment-205494577
'use strict';
var express = require('express');
var router = express.Router();
//var request = require("request");
var proxy_filter = function (path, req) {
return path.match('^/report') && ( req.method === 'GET' || req.method === 'POST' );
};
var proxy_options = {
target: 'http://localhost:8080',
logLevel: 'debug',
//logProvider:
onError(err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.' + err);
},
onProxyRes(proxyRes, req, res) {
//proxyRes.headers['x-added'] = 'foobar'; // add new header to response
//delete proxyRes.headers['x-removed']; // remove header from response
},
onProxyReq(proxyReq, req, res) {
if ( req.method == "POST" && req.body ) {
proxyReq.write( encodeURIComponent( JSON.stringify( req.body ) ) );
proxyReq.end();
}
}
};
// Proxy configuration
var proxy = require( 'http-proxy-middleware' )( proxy_filter, proxy_options );
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Node.js Express Proxy Test' });
});
router.all('/report/*', function( req, res, next ) {
//req.body.jdbc_sas = 'jdbc:postgresql://pg_dev:5432/sasdb';
//req.body.jdbc_agency = 'jdbc:postgresql://pg_dev:5432/agency0329';
//console.log('proxy body:',req.body);
proxy( req, res, next );
} );
module.exports = router;
如有任何建议,我们将不胜感激。
尊敬的
沃伦。
好的,这是最终解决方案。
以下示例允许您在转发到代理目标之前注入POST参数。据我所知,您不需要从代理目标响应中清除任何参数,因为它维护了原始POST请求的副本。
顺便说一句,这也允许http代理中间件与主体解析器一起工作。
示例节点快速路由文件:
'use strict';
var express = require('express');
var router = express.Router();
var proxy_filter = function (path, req) {
return path.match('^/docs') && ( req.method === 'GET' || req.method === 'POST' );
};
var proxy_options = {
target: 'http://localhost:8080',
pathRewrite: {
'^/docs' : '/java/rep/server1' // Host path & target path conversion
},
onError(err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.' + err);
},
onProxyReq(proxyReq, req, res) {
if ( req.method == "POST" && req.body ) {
// Add req.body logic here if needed....
// ....
// Remove body-parser body object from the request
if ( req.body ) delete req.body;
// Make any needed POST parameter changes
let body = new Object();
body.filename = 'reports/statistics/summary_2016.pdf';
body.routeid = 's003b012d002';
body.authid = 'bac02c1d-258a-4177-9da6-862580154960';
// URI encode JSON object
body = Object.keys( body ).map(function( key ) {
return encodeURIComponent( key ) + '=' + encodeURIComponent( body[ key ])
}).join('&');
// Update header
proxyReq.setHeader( 'content-type', 'application/x-www-form-urlencoded' );
proxyReq.setHeader( 'content-length', body.length );
// Write out body changes to the proxyReq stream
proxyReq.write( body );
proxyReq.end();
}
}
};
// Proxy configuration
var proxy = require( 'http-proxy-middleware' )( proxy_filter, proxy_options );
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Node.js Express Proxy Test' });
});
router.all('/document', proxy );
module.exports = router;
相关文章:
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- 在转发到代理目标并将响应发送回客户端之前,编辑POST参数
- Facebook Javascript API调用返回需要appsecret_proff参数的错误,但这是客户端
- 从客户端网站使用 ajax/jquery 将参数传递给 Web 服务方法
- 如何防止客户端用户更改 onClick 函数中的参数
- 路径参数或请求参数-从客户端角度
- 如何获取HTTP get请求传递的客户端参数
- javascript如何向客户端返回查询参数
- Ajax可以阻止客户端看到GET参数吗
- SignalR JS客户端:向invoke方法传递参数
- 客户端重定向使用地址栏参数
- 在javascript函数中作为参数传递服务器端控件的客户端ID
- 从客户端控制器指定Mongo查询参数(MEAN.JS)
- Meteor.js,Mongo:可以向用户插入新的文档或参数.来自客户端的配置文件
- 在Telerik MVC中使用客户端传递参数
- 当Asp.NetMVC参数从客户端传递到控制器时,它为null
- 如何从prototypejs客户端将pojo对象作为参数传递给rest web服务
- 如何将参数从prototypejs客户端传递到rest web服务
- 如何执行在服务器/客户端使用回调参数的javascript函数
- 静态 HTML 页面、客户端缓存和传递参数