没有 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 远程请求 - 服务器的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?