跨域GET请求,进行调用的浏览器和localhost之间的区别

时间:2014-06-19 16:18:59

标签: javascript jquery ajax get cross-domain

我尝试从本地托管的meteor应用程序(=> App running at: http://localhost:3000/)向API发出GET请求,然后我收到错误:

" XMLHttpRequest无法加载[-api-url]。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。因此,不允许原点http://localhost:3000访问。"

然而,当我将[the-api-url]粘贴到我的浏览器并点击ENTER时,我的浏览器窗口(一个小JSON对象)中会显示相应的API响应。我已经阅读了一些关于跨域请求问题的其他SO帖子,但我不了解这些解决方案,或者从我的代码或浏览器发送GET之间有什么区别。有人可以解释为什么会出现这种情况,以及对我的代码/设计的适当更改是什么?我现有的代码如下:

$.ajax({
  type: "get",
  url: auth_ad_act_url,
  data: {
    ads_token: ACCESS_TOKEN
  },
  dataType: 'jsonp',
  success: function(data, status) {
    console.log(data);
  }
});

编辑: 我做一个类型&#34的jQuery.ajax();得到"提供了URL,参数对象和成功回调函数,以及dataType' jsonp'处理跨域请求。

我发布了新代码。现在的错误是响应不正确。 (我知道这是因为它可以在我的浏览器中运行,并且该响应者按照API文档排列)。响应是"资源被解释为脚本但是使用MIME类型text / html传输:https://host.com/apps/[my-app-id]/authorize_ad_account?callbac ..."但它应该是一个带有键的对象' url'还有一件事。我也得到了错误" Uncaught SyntaxError:Unexpected token:"当我加入' jsonp'。但是上面提到的错误响应仍会记录到控制台,所以我不明白该语法错误何时发生,或者在哪里。

2 个答案:

答案 0 :(得分:0)

同源政策不包括您在地址栏中输入的内容。如果确实如此,除非将其保存在本地计算机上,否则根本无法访问任何网站!

在您的情况下,为了从jQuery获取所需的资源,您需要使用托管在匹配域上的服务器端代理,或者因为您正在使用JSON,请查看API是否为您'使用支持JSONP。

答案 1 :(得分:0)

有可能通过跨域请求获取JSON数据。您必须使用JSONP并定义一个回调方法,该方法必须在调用和JSON数据中。

您的要求:

$.ajax({
    type: "GET",
    url: auth_ad_act_url + "&callback=?",
    jsonpCallback: "jsonCallback",
    dataType: "jsonp",
    success: function(data) {
        // Do something with the data
    }
)};

外部服务器上的JSON文件:

jsonCallback(INSERT_HERE_THE_JSON_DATA);

如果您无法在外部服务器上添加jsonCallback,请查看CORS