【发布时间】:2016-01-08 19:54:27
【问题描述】:
我正在尝试创建一个必须对 CDAP 服务器进行 REST 调用的 Web 应用程序。当我尝试使用典型的 jQuery/AJAX 时,我遇到了 CORS/Access-Control-Allow-Origin 问题,原因很明显,这将是一个跨域请求。遗憾的是,CDAP 不支持 CORS。
现在我剩下的唯一选择是创建一个服务器端代理。以下是设置:
- Nodejs 为来自浏览器的所有调用公开了一个通用端点 (/rest/*)。
- 浏览器对节点代理进行所有调用以获取 cdap 资源。
以下是浏览器、Nodejs代理和CDAP之间的控制流程,
- 浏览器
- 对节点代理进行 (http) 调用。
- Nodejs 服务器
- 接收来自浏览器的 http 调用并适当更改 url 以向 CDAP 后端发出相同的请求。
- 从 CDAP 获取对上述请求的响应并将其路由回客户端。
Nodejs 代理在 localhost:8500 运行
CDAP 实例在 localhost:10000 运行
浏览器:
- 在 JS 中创建一个新应用(url 为 - http://localhost:8500/rest/v3/namespaces/default/apps/S3Text)
Nodejs 代理:
- 接收到这个请求并将url修改为-http://localhost:10000/v3/namespaces/default/apps/S3Text并向CDAP后端发出请求。
- 一旦收到来自 cdap 后端的响应,它就会将响应重新路由到客户端。
此 REST 调用的 curl 等效项如下:
curl -v localhost:10000/v3/namespaces/default/apps/S3Text -H "Content-Type: 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');
【问题讨论】:
-
我会尝试通过使用现成的代理来完成此任务,例如 NGINX (nginx.org/en) 并适当地配置它(如 nginx.com/resources/admin-guide/reverse-proxy 中所述)。这需要一点点学习,但 NGINX 就是为此而生的,所以应该不难。
-
@Adi Levin,谢谢,但我的组织不支持 NGINX。我想我只能使用 Node.js 来做到这一点。关于如何去做的任何想法?
-
所以,让我看看我是否理解您的问题:您在客户端的发布请求中发送了某些数据和标头,并且您希望您的 NodeJS 后端发送相同的数据和标头作为对 CDAP 的发布请求,然后您想以相反的方式传回响应,对吗?
-
实现起来并不难,但你也可以尝试使用现成的解决方案,例如github.com/nodejitsu/node-http-proxy
标签: javascript json node.js curl proxy