我正在尝试创建一个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);
});

09-25 18:40