我正在尝试向我无法控制的域上的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上运行网址,它显示状态确定和响应,所以我一定做错了。
我几乎浪费了一整天试图弄清楚如何解决这个问题。
非常感谢您的帮助。
答案 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);
}
});
});
答案 1 :(得分:1)
您需要设置某种类型的代理脚本。由于Same-origin policy,您无法对外部域上的资源进行ajax调用。您可以通过设置一个简单的PHP脚本来解决这个问题,该脚本将为您查询数据。然后,您可以将ajax调用指向您的脚本(将在您的域上托管)。该资源的内容类型是application / json,所以告诉jQuery类型是jsonp对你没用。
答案 2 :(得分:0)
出于安全原因,AJAX请求无法跨域工作。由于您正在阅读JSON数据,因此您可以使JSONP正常工作。
答案 3 :(得分:0)
jsonp响应不应该直接回调吗?