用于 json 和 jsonp 的 $.ajax 和 $.getJSON 无法正确获取来自第三方服务器的响应

$.ajax and $.getJSON for json and jsonp fail to properly get response from 3rd party server

本文关键字:获取 第三方 响应 服务器 jsonp json ajax getJSON 用于      更新时间:2023-09-26

正如标题所说,我正在尝试从站点提供的 API 中检索 json。我现在尝试了各种各样的东西,得到了不同的结果。我希望能够检索和解析 json,以便从中获取我想要的信息。这是我尝试过的:

1) $.ajax()代码块(单击按钮时运行):

  $.ajax({
            type: 'GET',
            url: url,
            dataType: 'json',
            success: function(data) {
                alert('Success!');
            }
        });

这会产生"Access-Control-Allow-Origin不允许Origin null"错误,并且没有从服务器获得响应(对于Chrome或FF,我不关心IE,因为这是一个供我使用的小项目)。环顾四周,我认为问题可能是我需要它是jsonp数据类型,因为我正在尝试连接到外部网站。这导致我尝试#2

2) $.ajax with jsonp dataType

$.ajax({
        type: 'GET',
        url: url,
        dataType: 'jsonp',
        success: function(data) {
            alert('Success!');
        }
    });

我还在我给函数的"url"末尾附加了"&callback=?"。使用 Chrom 的开发工具,我这次可以看到来自服务器的响应,但警报永远不会显示。我使用 JSONLINT 来确认响应是正确的 json(确实如此),并且我尝试将 json 设置为变量,以便我可以使用它(沿着脚本标签 [var response;] 中较早初始化变量并尝试将 json 分配给它[响应 = data;])。当我尝试警报(响应)时,这产生了未定义;后来(我不相信响应=json;由于某种原因,bit曾经被调用过)。

我也尝试过使用 $.getJSON,但查看它的 api 显然只是运行 $.ajax(幸运的是,我在尝试 json 与 jsonp 为 $.getJSON 时得到了与尝试 $.ajax 时相同的响应/错误)。当我尝试作为 jsonp Chrome(FF 不会产生此错误)时,显示"意外语法错误:意外令牌:"。这让我认为我尝试与之交谈的网站没有 jsonp 工作,我无法访问第三方网站,只是 json 请求。该链接讨论了如何将服务器设置为以应用程序/json 而不是文本/html 返回,就像我从我的响应中得到的那样,为他们解决了问题(但同样,我正在尝试访问第三方站点,因此我无法访问服务器)。

我已经在Chrome和FF中尝试过这个,并查看了每个Dev Tools/Firebug并看到了同样的事情(尽管FF不会产生原始错误,但这显然是Chrome的错误)。

另外:我已经获取了返回的 json 响应并在其上运行 $.parseJSON 并能够抓取各种部分,但是一旦我让 $.ajax/$.getJSON 工作,我如何访问 json?

任何想法/解决方案将不胜感激。

我也曾经遇到过Unexpected Syntax Error: Unexpected token :错误。

该网站

似乎不支持跨域加载。您尝试使用什么 API?

响应很可能是有效的 JSON,但不是有效的 JSONP。第三方服务器必须支持 JSONP,您才能获得 JSONP 响应。如果您无法控制第三方服务器,则唯一真正的选择是使用服务器端代理或YQL。

不要将 JQuery AJAX 用于 JSONP。

使用 <script type='text/javascript' src=' URL_GOES_HERE&callback=BLAH '></script> 它将用 javascript 方法调用包围 json 对象,然后您可以使用来自第三方源的数据。

http://en.wikipedia.org/wiki/JSONP

尝试使用 JSONP 插件。这是我推荐的为数不多的插件之一,只是因为它很轻,可以做它应该做的事情。它还允许您检查成功以外的响应。适用于 JSONP,并解决了我在使用子域时遇到的问题,并且没有得到正确的错误响应(随后只是停止了代码)。

在这里获取。

你试过这种方式吗?

$.getJSON( url + "?callback=?", function(data) {
    console.info(JSON.stringify(data, null, 2));
});

这基本上就是我管理对 http://freegeoip.net/json/的 JSONP 回调的方式