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

时间:2012-04-20 19:58:37

标签: javascript jquery json jsonp

正如标题所说我试图从网站给出的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,因为这是一个供我使用的小项目)。 Looking around我认为问题可能是我需要它成为jsonp dataType,因为我正在尝试连接到外部网站。这导致我尝试#2

2)$ .ajax with jsonp dataType

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

我还附加了“& callback =?”到了我给函数的“url”的结尾。使用Chrom的开发工具这次我可以看到来自服务器的响应,但警报从不显示。我使用JSONLINT来确认响应是一个正确的json(它是)并且我已经尝试将json设置为变量以便我可以使用它(沿着在脚本标记中早期初始化变量的行[var response;并尝试将json分配给它[response = data;])。当我试图提醒(响应)时,这产生了未定义;后来(我不相信响应= json;因为某些原因而被调用过)。

我也尝试过使用$ .getJSON,但是看看api它显然只是运行了$ .ajax(幸运的是,当尝试使用json vs jsonp for $ .getJSON时我得到了相同的响应/错误$阿贾克斯)。当我尝试作为jsonp Chrome(FF不会产生此错误)时显示“意外的语法错误:意外的令牌:”。 This让我觉得我正在尝试与之交谈的网站没有jsonp工作,我无法访问第三方网站只是一个json请求。该链接讨论了如何将服务器设置为application / json而不是text / html,就像我从我的响应中获得的那样,为他们修复了问题(但是,我再次尝试访问第三方网站,因此我可以不要访问服务器。

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

另外:我已经将json响应返回并在其上运行$ .parseJSON并且能够获取各种部分,但是一旦我获得$ .ajax / $。getJSON工作,我怎样才能访问json?

非常感谢任何想法/解决方案。

5 个答案:

答案 0 :(得分:0)

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

该网站似乎不支持跨域加载。 你想用什么API?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不要将JQuery AJAX用于JSONP。

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

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

答案 3 :(得分:0)

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

Get it Here

答案 4 :(得分:0)

你尝试过这种方式吗?

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

这基本上是我管理JSONP回调到http://freegeoip.net/json/

的方式