AngularJS 中跨域 REST 调用的正确架构模式是啥?

Posted

技术标签:

【中文标题】AngularJS 中跨域 REST 调用的正确架构模式是啥?【英文标题】:What is the correct architectural pattern for cross domain REST call in AngularJS?AngularJS 中跨域 REST 调用的正确架构模式是什么? 【发布时间】:2013-09-03 17:14:45 【问题描述】:

我创建了一个直接从客户端访问 Salesforce REST API 的 AngularJS 服务。但是,由于同源限制,我无法让它工作。即使在访问未经身份验证的 REST 服务并同时尝试 $http、$http.json 和 Ajax 时也是如此。我也尝试了很多 Json、Jsonp 等的组合。

鉴于我遇到了很多问题,我认为我的一般方法是不正确的。也许我需要为此设置代理服务器?我的后端是 Firebase,所以我目前没有自己的服务器。

我不相信 Salesforce API 支持 COR,我无法更改。

这是我尝试使用 $http 和 Ajax 的示例。

return $http.jsonp('https://na1.salesforce.com/services/data/',
headers: 
    'Content-type': 'application/json', 'Accept': 'application/json'
). 
                success(function (data, status, headers, config) 

                    callback(data);
                    console.debug(data.json);
                ).
                error(function (data, status, headers, config) 
                    console.debug("getVersions: failed to retrieve data: "+eval(data));
                );


$.ajax(
              url: 'https://na15.salesforce.com/services/data',
          type: "GET",
              dataType: "jsonp",
              beforeSend: function(xhrObj)
                                  xhrObj.setRequestHeader("Content-Type","application/json");
                                  xhrObj.setRequestHeader("Accept","application/json");
                                  xhrObj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
                              ,
              success: function (data) 
                  console.debug(data);
                  callback(data);
              ,
              error: function(data) 

              
          );

【问题讨论】:

是的,如果 Salesforce 端点不支持 CORS,那么您无法仅从客户端访问他们的服务。您需要在与您的 Web 应用服务器相同的域上运行一个简单的代理服务器,它将请求转发到 SalesForce API 端点并发送您的结果。 谢谢。这很有帮助 我设置了一个简单的 Ruby Sinatra 代理,它运行良好。我的应用是在多个子域上运行的 HTTPS,所以我仍然在 RUby 代码中设置访问控制响应标头 - response['Access-Control-Allow-Origin'] = '*' 太棒了!如果您有任何其他问题,请随时发送电子邮件至 support@firebase.com 或在 *** 上发布其他问题。 @Anant 是完全正确的。除了 same 上的代理之外,没有客户端解决方案 【参考方案1】:

您需要进入 SalesForce 中的远程设置,然后进入 CORS 并将域名列入白名单...

我遇到了同样的问题,它似乎已经解决了这个问题。

看看这是否有帮助here

【讨论】:

以上是关于AngularJS 中跨域 REST 调用的正确架构模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中跨域的http post请求

js中跨域请求原理及2种常见解决方案

在 Angular js 中跨 2 个控制器选择的绑定值

在 DDD 整体中跨服务/模块时,在我的处理程序中调用调解器是不是正确

多种解决react中跨域问题方案

多种解决react中跨域问题方案