对于我的前端(角度)应用,我需要连接到不支持CORS的外部API。
所以我的方法是在Node.JS / Express.JS中使用一个简单的代理来传递请求。另外一个好处是我可以在代理级别设置我的api-credentials,而不必将它们传递给用户可能窃取/滥用它们的前端。
这一切都很完美。
以下是记录的代码:
var request = require('request');
var config = require('./config');
var url = config.api.endpoint;
var uname = config.api.uname;
var pword = config.api.pword;
var headers = {
"Authorization" : 'Basic ' + new Buffer(uname + ':' + pword).toString('base64'),
"Accept" : "application/json"
};
exports.get = function(req, res) {
var api_url = url+req.url;
var r = request({url: api_url, headers: headers});
req.pipe(r).pipe(res);
};
我必须使用的API端点只有XML作为输出格式。所以我在前端使用xml2js将XML响应转换为JSON。
这也很有效,但我想减轻客户端的负担,并执行XML - >服务器上的JSON解析步骤。
我认为我必须创建类似的东西:
req.pipe(r).pipe(<convert_xml_to_json>).pipe(res);
但我不知道如何创造这样的东西。
所以基本上我正在寻找创建XML到JSON代理作为现有API之上的层。
关于“如何创建代理”以及“如何将XML转换为JSON”,有很多关于SO的问题,但我找不到将两者结合起来的任何问题。
答案 0 :(得分:1)
你需要使用transform stream并且对于xml到json的转换你需要一些库我使用这个xml2json
..然后你像这样使用它(简化但它也应该与请求一起使用)
var http = require('http');
var fs = require('fs');
var parser = require('xml2json');
var Transform = require('stream').Transform;
function xmlParser () {
var transform = new Transform();
transform._transform = function(chunk, encoding, done) {
chunk = parser.toJson(chunk.toString())
console.log(chunk);
this.push(chunk);
done();
};
transform.on('error', function (err) {
console.log(err);
});
return transform;
}
var server = http.createServer(function (req, res) {
var stream = fs.createReadStream(__dirname + '/data.xml');
stream.pipe(xmlParser()).pipe(res);
});
server.listen(8000);