我正在尝试使用Node JS编写API服务的前端。
我希望用户可以将他们的浏览器指向我的节点服务器并发出请求。该节点脚本将修改请求的输入,调用API服务,然后修改输出并传递回用户。
我喜欢这里的解决方案(使用Express JS和node-http-proxy),因为它直接从用户通过我的站点传递cookie和标头到API服务器。
我知道如何修改请求的输入,但我无法弄清楚如何修改响应。有什么建议吗?
我正在尝试使用Node JS编写API服务的前端。
我希望用户可以将他们的浏览器指向我的节点服务器并发出请求。该节点脚本将修改请求的输入,调用API服务,然后修改输出并传递回用户。
我喜欢这里的解决方案(使用Express JS和node-http-proxy),因为它直接从用户通过我的站点传递cookie和标头到API服务器。
我知道如何修改请求的输入,但我无法弄清楚如何修改响应。有什么建议吗?
transformer-proxy 在这里可能很有用。我是这个插件的作者,我在这里回答是因为当我寻找同样的问题时发现了这个页面,而且对于 harmon 我不满意,因为我不想操作 HTML。
也许其他人正在寻找这个,并发现它有用。
var httpProxy = require('http-proxy');
var modifyResponse = require('http-proxy-response-rewrite');
var proxy = httpProxy.createServer({
target:'target server IP here',
});
proxy.listen(8001);
proxy.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
});
proxy.on('proxyRes', function (proxyRes, req, res) {
modifyResponse(res, proxyRes.headers['content-encoding'], function (body) {
if (body && (body.indexOf("<process-order-response>")!= -1)) {
var beforeTag = "</receipt-text>"; //tag after which u can add data to
// response
var beforeTagBody = body.substring(0,(body.indexOf(beforeTag) + beforeTag.length));
var requiredXml = " <ga-loyalty-rewards>\n"+
"<previousBalance>0</previousBalance>\n"+
"<availableBalance>0</availableBalance>\n"+
"<accuruedAmount>0</accuruedAmount>\n"+
"<redeemedAmount>0</redeemedAmount>\n"+
"</ga-loyalty-rewards>";
var afterTagBody = body.substring(body.indexOf(beforeTag)+ beforeTag.length)+
var res = [];
res.push(beforeTagBody, requiredXml, afterTagBody);
console.log(res.join(""));
return res.join("");
}
return body;
});
});
http-proxy-interceptor是我为此目的编写的中间件。它允许您使用一个或多个变换流来修改HTTP响应。有大量基于流的包可用(例如trumpet,Harmon使用的包),通过使用流,您可以避免缓冲整个响应。