如何访问托管在其他域的 Rest API 数据。跨域问题

Posted

技术标签:

【中文标题】如何访问托管在其他域的 Rest API 数据。跨域问题【英文标题】:How to access Rest API data hosted at other domain. Cross domain issue 【发布时间】:2013-10-21 01:42:26 【问题描述】:

我可以通过 JQuery 从本地 Rest api 成功访问数据,但是当我尝试通过 JQuery 从远程 Rest API(托管在其他域)访问数据时,我得到了未定义的错误。 我如何解决跨域问题?

这就是我通过 JQuery 使用的方式。

function GetCompanyName(id) 
    jQuery.support.cors = true;
    $.ajax(
        url: 'http://novacompanysvc.azurewebsites.net/api/companies',
        type: 'GET',
        data: id:id ,
        dataType: "text/xml",
    success: function (data) 
       if (window.DOMParser)
          
          parser=new DOMParser();
          xmlDoc=parser.parseFromString(data,"text/xml");
          
        else // Internet Explorer
          
          xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async=false;
          xmlDoc.loadXML(data); 
          
       WriteResponse(data);
     ,
     error: function (x, y, z) 
            alert('error');
     
  );

【问题讨论】:

【参考方案1】:

发生此错误是因为您访问的 API 端点未实现 CORS。 如果你在 Chrome 中运行代码并查看控制台,你会看到一个错误:

XMLHttpRequest cannot load http://novacompanysvc.azurewebsites.net/api/companies?id=1. Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

解决方案是更改 API 端点,将 Access-Control-Allow-Origin 标头设置为通配符 * 或将提供使用 javascript 代码的页面的域。

【讨论】:

谢谢。如何更改 API 端点以设置 Access-Control-Allow-Origin?由于我是 JQuery 方面的新手,您能否通过提供示例代码给我解决方案? API 服务器是用什么语言或框架编写的?根据这一点,您将不得不对服务器代码进行一些更改。【参考方案2】:

我也遇到了同样的问题。

现在由我解决。 假设您有两个域。 域1 和域2

你可以使用这种技术。

通过在domain1中使用服务器端脚本创建一个中间层,您可以使用java,php等从domain2中获取数据,然后在domain1中创建一个rest服务并在domain1中使用rest服务。

【讨论】:

【参考方案3】:

我也遇到过这个问题。我解决了这个问题

避免混合内容阻塞是将所有内容作为 HTTPS 而不是 HTTP。

为您自己的域提供所有内容作为 HTTPS 并修复您的链接。 你把:http// 到 https//

对于其他域,如果可用,请使用网站的 HTTPS 版本。如果 HTTPS 不可用,您可以尝试联系域并询问他们是否可以通过 HTTPS 提供内容。

【讨论】:

以上是关于如何访问托管在其他域的 Rest API 数据。跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 REST API 上直接启用托管元数据字段的过滤器?

解决浏览器跨域的几种方式

跨两个不同域的单个API存储?

前后端分离Django解决跨域的问题

从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误

如何从 REST API 访问嵌套的 json?