我正在尝试创建一个Web应用程序,该应用程序必须对CDAP服务器进行REST调用。当我尝试使用典型的jQuery / AJAX时,由于明显的原因(这将是跨域请求),我遇到了CORS / Access-Control-Allow-Origin问题。遗憾的是,CDAP不支持CORS。
现在,唯一剩下的选择就是创建服务器端代理。以下是设置:
Nodejs为来自浏览器的所有调用公开通用端点(/ rest / *)。
浏览器向cdap资源的节点代理发出所有调用。
以下是浏览器,Nodejs代理和CDAP之间的控制流程,
浏览器
对节点代理进行(http)调用。
Nodejs服务器
接收来自浏览器的http调用,并适当更改url以向CDAP后端发出相同的请求。
从CDAP获得对以上请求的响应,并将其路由回客户端。
Node.js代理在本地主机上运行:8500
CDAP实例正在localhost:10000运行
浏览器:
在JS中创建一个新应用(URL为-http://localhost:8500/rest/v3/namespaces/default/apps/S3Text)
Node.js代理:
接收到此请求并将URL修改为-http://localhost:10000/v3/namespaces/default/apps/S3Text,并向CDAP后端发出请求。
一旦从cdap后端收到响应,它便将响应重新路由到客户端。
该REST调用的curl等效项如下:
curl -v本地主机:10000 / v3 / namespaces / default / apps / S3Text -H“内容类型:application / json” -d @ new.json -X PUT
我是Node.js的新手,但已阅读一些文档,并浏览了一些视频。我遇到的问题是我需要加载JSON文件和其他参数(例如方法,数据,dataType等)的哪一部分。它将在JS代码中还是在Node.js代理服务器代码中。如果必须输入nodeProxy.js代码,那么我需要在哪里以及如何传递它们?如果我天真,我会道歉。
JS代码:
function sendCurlRequest(){
var jsonData = <JSON_DATA>;
$.ajax({
cache : false,
method: "PUT",
crossDomain: true,
url: 'http://localhost:8500/rest/v3/namespaces/default/apps/S3Text',
data: jsonData,
dataType: "json",
contentType: "application/json",
success: function(data){
alert("Success");
},
error: function(data){
alert("Error: " + JSON.stringify(data));
},
complete: function(data){
console.log("Call Completed");
}
});
}
nodeProxy.js代码:
var http = require('http');
var httpRequest = require('request');
var destinationURL = 'http://localhost:1000/v3/namespaces/default/apps/S3Text';
http.createServer(function (req, res) {
var options = {
url: destinationURL
}
var destinationResponse = req.pipe(request(options))destinationResponse.pipe(res)
}).listen(8500, 'localhost');
console.log('Server running at http://localhost:8500');
最佳答案
如果您愿意使用某些Node模块,那么这可能会起作用,尽管我认为它不会将您的URL从localhost:8500/rest/v3
更改为localhost:10000/v3
。 /rest/
将保留。
JS
return $http.get("http://localhost:8500/rest/v3/namespaces/default/apps/S3Text")
return $http.post("http://localhost:8500/rest/v3/namespaces/default/apps/S3Text/other", availReqObj);
节点
var express = require('express');
var app = express();
var cors = require('cors');
var proxy = require('http-proxy-middleware');
var port = process.env.PORT || 8500;
app.use(express.static("" + __dirname));
app.use(cors());
app.use('/rest/v3/namespaces/default/apps/S3Text',
proxy({target: "http://localhost:10000",
changeOrigin: false,
logLevel: 'debug'
})
);
app.use('/rest/v3/namespaces/default/apps/S3Text/other',
proxy({target: "http://localhost:10000",
changeOrigin: false,
logLevel: 'debug'
})
);
app.listen(port, function() {
console.log("Listening at " + port);
});