【问题标题】:Strange JSONP syntax error奇怪的 JSONP 语法错误
【发布时间】:2014-08-27 01:23:02
【问题描述】:

我被这个奇怪的语法错误所困扰,它指向 json 返回的第一个键:值对中的冒号。 JSONLint.com 说 json 是有效的。任何人都可以帮忙吗? JSFiddle 链接如下。谢谢

http://jsfiddle.net/gbkester/hgt8bvb8/

$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "http://forecast.weather.gov/MapClick.php?lat=38.14000&lon=-78.45000&FcstType=digitalJSON",
        dataType: 'jsonp',
        success: function (json) {
            console.log(json)
        }
    })
})

【问题讨论】:

  • 尝试将jsonp改为json。
  • jsonp 更改为json 并不容易。可能有同源限制会阻止此操作。
  • 对,由于跨域阻塞,我希望让它与 jsonp 一起工作。谢谢

标签: javascript jquery ajax json jsonp


【解决方案1】:

在我看来,这个响应实际上并不是 JSONP。它看起来像直接的 JSON。

通常 JSONP 端点接受 callback= URL 参数。此参数的值用于命名包装实际对象的函数。所以,例如:

http://example.com/api/endpoint?callback=foobar

会返回类似:

foobar({"key":"value"});

你可以看到 jQuery 在 Fiddle 中尝试这个:

http://forecast.weather.gov/MapClick.php?...&callback=jQuery11100967190676368773_1409103826888&_=1409103826889

callback= 正在命名它希望看到返回的函数,_= 是缓存破坏的尝试。它希望看到如下响应:

jQuery11100967190676368773_1409103826888({ ... });

添加或删除此参数似乎不会更改响应内容。没有方便的 API 文档,他们可能为此使用了不同的参数。例如,如果他们使用bazquux 作为参数,您可以将请求更改为:

$.ajax({
    ...
    url: "http://forecast.weather.gov/MapClick.php?lat=38.14000&lon=-78.45000&FcstType=digitalJSON&bazquux=?",
    ...
})

注意文字&bazquux=?

【讨论】:

  • 不幸的是,我找不到 NWS 提供的关于 json 响应的任何文档。可用的文档是关于他们的 xml 格式的响应,这会导致跨域阻塞错误。关于如何嗅探回调函数或以其他方式使用此提要客户端的任何其他想法?如果没有,我想我会在服务器端写一些东西,这似乎很可惜。谢谢
【解决方案2】:

您缺少分号:

  1. console.log(json) 之后
  2. 在 ajax 块的右圆括号之后
  3. 'ready' 函数的右圆括号之后

【讨论】:

  • 如果我们说的很严格,当然可以。但是 ASI 的规则非常清楚地表明,将所有这些实例都排除在外是完全有效的。
猜你喜欢
  • 2014-04-14
  • 2013-09-03
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多