【问题标题】:How to add Access-Control-Allow-Origin in Shiny Server (Non Pro)?如何在 Shiny Server (Non Pro) 中添加 Access-Control-Allow-Origin?
【发布时间】:2020-01-29 12:14:03
【问题描述】:

从源“http://localhost:1826”访问“http://10.131.12.49:8010/get.me.data?opt=All”处的 XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我正在通过 Angular 框架调用 HttpRequest。

我试过R Shiny - how to add Access-Control-Allow-Origin: *

但我们不能说每个用户都安装特定的扩展来使用它。

众所周知,shiny server pro 不是开源的,它会超出我们项目的预算。那么有没有永久的解决方案来解决这个问题?

export class DashboardService {

  private apiUrl = 'http://10.131.12.49:8010/get.me.data?opt=All';

  //jsonp: any;
  constructor(
    // private http: Http, 
    private http:HttpClient,
  ) { }

  CustReport() {  
    return this.http.get(this.apiUrl)
  }

预期结果:

[{"AVG_THROUGHPUT":1976.0432,"AVG_DCR":0.0919}]

【问题讨论】:

    标签: javascript r angular cors shiny-server


    【解决方案1】:

    Shiny 服务器(非专业版)不支持设置自定义标头。因此,在这种情况下,您可以创建一个简单的 http 服务器,将您的请求代理到闪亮的服务器。然后使用 http://proxyserver/{path} 进行 API 调用。

    const http = require("http");
    const httpProxy = require("http-proxy");
    
    const proxy = httpProxy.createProxyServer({});
    const server = http.createServer(function(req, res) {
      res.oldWriteHead = res.writeHead;
      res.writeHead = (statusCode, headers) => {
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Expose-Headers", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        res.setHeader(
          "Access-Control-Allow-Methods",
          "GET, POST, PATCH, PUT, DELETE, OPTIONS"
        );
        res.oldWriteHead(statusCode, headers);
      };
    
      if (req.method === "OPTIONS") {
        res.writeHead(200);
        res.end();
        return;
      }
      proxy.web(req, res, {
        // Target to Shiny server
        target: "http://10.131.12.49:8010"
      });
    });
    
    server.listen(5050);
    console.log("listening on port 5050");

    【讨论】:

      【解决方案2】:

      您不能修改服务器。如果我们考虑到您所处的环境,这种方法将行不通。 我建议您将后端用作 Angular 应用程序和 Shiny 服务器之间的中间件。 为此,您可以在后端创建一个端点,例如:

      /api/cors?url=http://10.131.12.49:8010/get.me.data?opt=All

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 2017-12-16
        相关资源
        最近更新 更多