无法使用JSONP获取远程JSON

时间:2014-07-30 12:22:40

标签: javascript jquery ajax json jsonp

我试图使用jQuery 1.11.1检索远程JSON。远程服务器 支持jsonp,我只需在浏览器中输入呼叫地址和?callback=foo即可下载.jsonp文件。

然而,当我尝试使用ajax获取它时,它失败了。

$.ajax({
    type: "GET",
    url: "http://path-to-remote-server.net/file.jsonp",
    dataType: 'jsonp',
    jsonp : "callback",
    jsonpCallback: "e",
    success: function(r) {
        console.log(r);
    }
});

快速查看控制台告诉我这是一个糟糕的请求,可能是因为看起来jQuery传递了第二个不需要的参数,使请求看起来像这样:

http://path-to-remote-server.net/file.jsonp?callback=e&_=1406722474006

即使我省略了jsonp和jsonpCallback选项,也会发生这种情况。然后请求如下所示:

http://path-to-remote-server.net/file.jsonp?callback=jQuery111106199050471186638_1406722685544&_=1406722685545

使用捷径$ .getJSON也不起作用,但不是出于同样的原因:

$.getJSON("http://path-to-remote-server.net/file.jsonp?callback=e", function(r){
    console.log(r);
});

这不会触发控制台中的任何错误,但也不会记录任何错误,就好像它没有从服务器返回任何内容。

为什么会这样,我该如何避免呢?

提前谢谢大家!

2 个答案:

答案 0 :(得分:0)

来自the manual

  

缓存(默认值:true,false表示dataType'脚本'和' jsonp')
  类型:布尔

  如果设置为false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为false只能与HEAD和GET请求一起正常工作。它的工作原理是附加" _ = {timestamp}"到GET参数。其他类型的请求不需要该参数,但在IE8中,当对已经由GET请求的URL进行POST时,该参数除外。

所以将cache: true添加到Ajax参数中。

答案 1 :(得分:-1)

需要jQuery自动添加的最后一个查询字符串参数,以避免浏览器缓存。否则,如果您在站点的同一页面或任何其他页面中执行相同的JSONP调用,您将获得缓存结果而不是新结果。因此,如果您的服务器支持JSONP,它应该接受这样的请求。

这似乎是一个服务器端问题,所以你应该检查那里发生了什么:)