【问题标题】:JSONP cross origin error 'No Access-Control-Allow-Origin header is present'JSONP 跨源错误“不存在 Access-Control-Allow-Origin 标头”
【发布时间】:2013-12-29 09:32:18
【问题描述】:

我正在使用 Ajax 通过他们的 API 从 twitter 获取数据。我正在尝试使用 jsonp,从我所看到和理解的情况来看,我认为我做的一切都是正确的(但显然不是)。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">  </script>
<script>
    $(document).ready(function () {
        $.ajax( {
            type: 'GET',
            datatype: 'jsonp',
            data: {},
            crossDomain: 'true',
            url: "http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?",
            error: function(textStatus, errorThrown) {
                alert("error");
            },
            success: function(msg) {
                console.log(msg);
            }
        });
    });
</script>

上面的代码在 Chrome 和 Firefox 中都会产生错误 XMLHttpRequest cannot load http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'null'。

据我了解,我认为拥有&amp;callback=? 并将类型设置为jsonp 可以让这成功。更重要的是,我可以看到在提琴手中返回的 JSON 对象只是没有被脚本处理。我已经尝试了多个 API,但出现了相同的问题。

当输入地址栏时,这样的一个 API 也可以工作。

所以我经过广泛的搜索和寻找我需要一些如何将原点设置为*?我认为这更像是服务器端问题?

我也尝试过?callback?,但无济于事。

任何想法都会很棒,谢谢。

【问题讨论】:

  • 必须在服务器上设置 Access-Control-Allow-Origin 标头。在这种情况下,服务器属于 Twitter。 Read more here
  • @Paul Rene 所以这不是他们会自动配置的东西吗?作为一个公共 API,我认为这将由他们处理?
  • @Corey 这是设计使然。他们不再需要未经身份验证的 API 请求。他们希望您使用 API 密钥和服务器来发出请求。

标签: javascript ajax json jquery


【解决方案1】:

上述资源支持jsonp,所以不需要CORS...问题是datatype: 'jsonp'应该是dataType: 'jsonp'

$(document).ready(function () {
    $.ajax({
        type: 'GET',
        dataType: 'jsonp',
        data: {},
        url: "http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?",
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR)
        },
        success: function (msg) {
            console.log(msg);
        }
    });
});

演示:Fiddle

【讨论】:

【解决方案2】:

应该在 Twitter 的服务器响应时设置标头。如果它不可用,则意味着您无法从他们自己的域之外的任何地方使用 AJAX 访问此资源。
因此,您不能在浏览器上通过 javascript 使用他们的 API。您已经设置了自己的服务器,该服务器充当与 Twitter API 通信的中间资源。

编辑:在这一点上还值得指出的是,twitter 正在关闭他们未经身份验证的 API 请求。您需要使用 twitter 设置应用程序并使用 API 密钥发出请求。

【讨论】:

  • 好的,那么直接通过浏览器访问是怎么成功的,是不是意味着Access-Control-Allow-Origin被设置为*或者服务器对这个请求的处理方式不同呢?顺便说一句,我没有提到 Twitters API。
  • @Corey 是的,直接在浏览器中打开 URL 不支持 Access-Control-Allow-Origin 标头,服务器处理它的方式不同。 Twitter 在他们的计划中停止了未经身份验证的请求,例如您的示例。我不确定它是否已经完成。但原则(和我的回答)对于所有 API 都是相同的。
猜你喜欢
  • 2017-11-30
  • 2017-12-16
  • 2018-09-29
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2018-10-28
  • 2015-04-17
相关资源
最近更新 更多