没有 JSONP 的 getJSON 远程请求 - 服务器

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

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

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

【讨论】:

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

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

因此,您有两个选择:

    正如人们所说,使用后端代理在服务器端发出请求。 如果您只需要支持一个浏览器(在我的例子中是 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/

【讨论】:

以上是关于没有 JSONP 的 getJSON 远程请求 - 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在跨域请求中捕获 JSONP 错误

使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?

使用 jsonp 错误的 jQuery ajax 请求

JSONP 的 getJSON 回调有啥意义?

使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?

$.getJSON JSONP的新坑