【问题标题】:Failing to get remote JSON using JSONP无法使用 JSONP 获取远程 JSON
【发布时间】:2014-07-30 12:22:40
【问题描述】:

我正在尝试使用 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);
});

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

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

提前谢谢大家!

【问题讨论】:

  • “快速查看控制台告诉我这是一个错误的请求”——它究竟告诉你什么?
  • Failed to load resource: the server responded with a status of 400 (Bad Request)
  • 这是一个非常奇怪的服务器,当您添加额外的查询字符串参数时,它开始抛出 400 错误。
  • 您不需要 jsonp 键/值,因为它已经默认为 callback,我建议也删除 jsonpCallback 键/值并让 jQuery 自动处理给你。
  • 我一开始尝试过,但奇怪的是,当我让 jQuery 自动处理回调并抛出错误时,服务器似乎不喜欢它。另外,有没有办法在回调之后手动传递第二个特定参数

标签: javascript jquery ajax json jsonp


【解决方案1】:

来自the manual

缓存(默认:true,对于 dataType 'script' 和 'jsonp' 为 false)
类型:布尔值
如果设置为 false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为 false 仅适用于 HEAD 和 GET 请求。它通过将“_={timestamp}”附加到 GET 参数来工作。其他类型的请求不需要该参数,除非在 IE8 中对已由 GET 请求的 URL 进行 POST。

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

【讨论】:

  • 这似乎解决了我的问题!谢谢!
  • 但是,当我每 X 秒检索一次远程 json 时,打开缓存可能是个问题。服务器似乎以某种方式自行处理,因为浏览器似乎没有缓存数据。
【解决方案2】:

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

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

【讨论】:

  • 为什么投反对票?如果是因为我所说的关于缓存的内容,请注意,这正是 OP 通过设置 cache: true... 在上面的评论中注意到的内容...服务器缓存响应并自行处理所有下一个请求,所以你不要'没有为每个请求获得新的响应,导致潜在的意外结果
  • 编辑:对不起,我想说“浏览器缓存响应”,而不是“服务器”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2018-09-25
  • 2018-04-24
相关资源
最近更新 更多