JSON使用JQuery获取请求(跨域)

时间:2014-02-02 01:36:24

标签: javascript jquery ajax json

我正在尝试向我无法控制的域上的API发出简单的JSON get请求。

我的代码很简单:

$(document).ready(function () {
        $.ajax({
            type: 'GET',
            url: 'http://pubapi.cryptsy.com/api.php?method=marketdatav2',
            success: function (data) {
                console.log(data);
            }
        });
});

但由于这是跨域请求,因此我在Chrome控制台中收到此错误:

XMLHttpRequest cannot load http://pubapi.cryptsy.com/api.php?method=marketdatav2. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fiddle.jshell.net' is therefore not allowed access.

当我尝试添加参数dataType: 'jsonp'时,Console会返回此错误:

  

Uncaught SyntaxError:意外的令牌:

但是,当我检查Chrome中的“网络”标签时,我看到在“标题”下,“状态代码”为200 OK,我实际上可以在“响应”选项卡中看到完整的响应,但控制台仍显示“意外令牌:”错误, JQuery JSON请求仍然失败。

以下是JS Fiddle链接:http://jsfiddle.net/6Qcq2/您可以看到相同的结果

我尝试在http://www.hurl.it上运行网址,它显示状态确定和响应,所以我一定做错了。

我几乎浪费了一整天试图弄清楚如何解决这个问题。

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:9)

API的响应是JSON,而不是JSONP,所以只是更改数据类型没有帮助。

您可以使用发出请求的代理并将JSON转换为JSONP:

$(document).ready(function () {
    $.ajax({
        type: 'GET',
        url: 'http://jsonp.guffa.com/Proxy.ashx?url=pubapi.cryptsy.com%2fapi.php%3fmethod=marketdatav2',
        dataType: 'jsonp',
        success: function (data) {
            console.log(data);
        }
    });
});

演示:http://jsfiddle.net/6Qcq2/1/

答案 1 :(得分:1)

您需要设置某种类型的代理脚本。由于Same-origin policy,您无法对外部域上的资源进行ajax调用。您可以通过设置一个简单的PHP脚本来解决这个问题,该脚本将为您查询数据。然后,您可以将ajax调用指向您的脚本(将在您的域上托管)。该资源的内容类型是application / json,所以告诉jQuery类型是jsonp对你没用。

答案 2 :(得分:0)

出于安全原因,AJAX请求无法跨域工作。由于您正在阅读JSON数据,因此您可以使JSONP正常工作。

答案 3 :(得分:0)

jsonp响应不应该直接回调吗?

What is JSONP all about?