【问题标题】:getJSON remote request without JSONP - Server没有 JSONP 的 getJSON 远程请求 - 服务器
【发布时间】:2011-05-14 15:15:39
【问题描述】:

我正在尝试从远程服务器调用 JSON 数据,但服务器不返回有效的 JSONP 格式数据,只返回有效的 JSON 数据。 (通过验证者确认)

如果我发出 getJSON 请求(使用 &callback=?),我会返回有效的 JSON,但它不会触发回调函数,因为它不是有效的 JSONP。

有什么好的方法可以访问返回的 JSON 数据吗?

【问题讨论】:

  • 您是否在控制远程服务器?您无法通过服务器脚本调用远程服务器吗?
  • 如果还可以的话请提供远程服务器的url
  • 我注意到我是否可以提及它,所以我最好不要。而且我也无法访问服务器,只能访问 JSON 数据。

标签: json cross-domain jsonp getjson same-origin-policy


【解决方案1】:

不,它必须是 JSONP 数据,因为整个事情是如何工作的,它基本上是通过创建一个 <script> 标记来包含一个 JavaScript 文件......并且该响应必须是有效的 JavaScript,一个对象文字(本身) 不是有效的 JavaScript。

换一种方式想一想:如果我们可以从远程服务器获取 JSON,为什么会有 JSONP? :)

【讨论】:

  • 好吧,如果它不起作用,我可能不得不使用 php 来获取 JSON 数据并让 php 将其传递给 js。想避免它,但似乎这是这种情况下的唯一方法。
  • @Tim - 是的,如果代理不支持 JSONP,代理是唯一的其他选择,但请检查他们是否使用不同的格式来指定回调,有些使用 jsonpcallback=jsoncallback= 或完全不同的 URL 格式。
【解决方案2】:

是的,很糟糕。我对 Viddler API(浏览器端)有同样的问题。它正在发回 JSON 数据,但不是在脚本化 JSON-P 接口中。

因此,您有两个选择:

  1. 正如人们所说,使用后端代理在服务器端发出请求。
  2. 如果您只需要支持一个浏览器(在我的例子中是 Chromium),请使用类似“chromium-browser --disable-web-security”的东西来禁用“same-origin-policy”规则。这将允许您发出跨域请求,但仅限于这种非常特殊的情况。

祝你好运!

【讨论】:

    【解决方案3】:

    首先,如果您从中获取 JSON 的服务器不支持 JSONP,那么您将不得不使用代理。如果它确实支持 JSONP,您应该像下面的示例一样格式化您的请求。如果您没有在 $.getJSON(...&callback=?) 中指定回调,那么您的请求将如下所示:

    http://someurl?callback=123489234982
    

    结尾有一些荒谬的数字,这会让你的生活变得痛苦。因此,您应该指定一个回调并格式化您的代码,如下所示:

    <script>
         $.getJSON("your url?callback=callbackName", ....);
    
         function callbackName { do what you want with the json in here }
    </script>
    

    如果这不起作用,那么您的服务器不支持 JSONP :( 这是一个您可以使用的 php 代理的链接,它非常好并且有很多文档。

    http://benalman.com/projects/php-simple-proxy/

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2012-12-23
      • 2014-07-03
      • 2015-11-11
      • 1970-01-01
      • 2018-04-24
      • 2012-09-21
      • 1970-01-01
      • 2012-10-23
      相关资源
      最近更新 更多