JSON:如何进行跨域 JSON 调用
Posted
技术标签:
【中文标题】JSON:如何进行跨域 JSON 调用【英文标题】:JSON: How do I make cross-domain JSON call 【发布时间】:2011-07-29 18:37:35 【问题描述】:我尝试在本地网络中运行以下 jquery 代码。
$.ajax(
type: "GET",
url: "http://SomeSite/MyUrl/",
cache: false,
data: ... ,
dataType: "json",
error: function (xhr, status, error)
...
,
success: function (json)
...
);
在“SomeSite”是 localhost 之前一切正常。我的意思是与下载页面的服务器相同。
但是当“SomeSite”是另一个(不是本地主机)网络站点时,它看起来请求挂起。不会调用“错误”,也不会调用“成功”回调函数。我怎样才能使这段代码工作?
提前感谢您!
【问题讨论】:
你在哪个浏览器上测试过? 【参考方案1】:我有同样的问题。试图从服务器获取 json 到我无法访问的地方(=> 没有 JSONP)。
我找到了http://benalman.com/projects/php-simple-proxy/ 将 php 代理添加到您的服务器并对这个文件进行 ajax 调用。 "任何要传递到远程 URL 资源的 GET 参数都必须在此参数中进行 urlencoded。"
$.ajax(
type: 'GET',
url:'proxy.php?url=http://anyDomain.com?someid=thispage',
dataType: "json",
success: function(data)
// success_fn(data);
,
error: function(jqXHR, textStatus, errorThrown)
// error_fn(jqXHR, textStatus, errorThrown);
);
proxy.php(来自 Ben Alman 的文件)托管在您的域中
替代方案(我发现这是第二好的):http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/
【讨论】:
替代方案就像一个魅力。谢谢!但是代理 php 总是失败,有关于未定义可选参数的 PHP 通知,并且 json 中的内容变量始终为空。【参考方案2】:您是否具有访问“SomeSite”的服务器权限,或者它是第 3 方?
如果你有访问权限,你可以启用CORS
wp, home。最简单的形式(数据不是会话敏感的),只需添加标题:Access-Control-Allow-Origin: *
如果你没有访问权限,你知道它是否支持JSONP
wp,so?这通常涉及在 URL 中传递至少一个 callback
参数。 (当然,如果你有访问权限,你也可以添加JSONP
支持。)
CORS
和JSONP
,甚至可以翻译数据格式、选择部分数据等。
(请注意,YQL 尊重robots.txt
,因此如果它是限制自动访问的第 3 方网站,您可能仍然不走运。)
【讨论】:
hmoe 和 wp 上的这些链接每组转到不同的网站应该做什么? "wp" = 事物的***页面。 “home”是事物的主页。 你的第二个主页链接是一个 youtube 视频,里面有我假设的歌词 @AaA:主页好像失效了,有人拿走了它并在那里进行了重定向。我将用关于 JSONP 的最大 SO 问题替换它。【参考方案3】:我遇到了类似的问题。我尝试了 Symba 引用的代理脚本,但由于某种原因它无法在我的机器上运行。就我而言,我试图将请求发送到托管在同一主机上的 JBoss AS 上的应用程序。不知何故,我的 JBoss 版本无法修改响应标头,以便我可以包含“Access-Control-Allow-Origin”、“*”。
我通过使用上述 Symba 的方法解决了这个问题,但我只是在我的 Apache 服务器上设置了一个反向代理,而不是 Ben Alman 的脚本,请参阅 https://www.simplified.guide/apache/configure-reverse-proxy 。 默认情况下,Apache 仍然存在跨域问题。通过设置响应头“Access-Control-Allow-Origin”、“*”,参见http://enable-cors.org/server_apache.html,问题就消失了。
【讨论】:
【参考方案4】:你可以试试jsonp请求http://api.jquery.com/jQuery.ajax/见跨域
【讨论】:
【参考方案5】:请查看cross domain jquery ajax request。如果远程服务器支持 JSONP,那么我想你可以使用回调。
【讨论】:
【参考方案6】:实际上你只能调用 GET。 没有通过跨站点脚本调用 POST、PUT、DELETE 或 PATCH 的防故障方法。 唯一可行的方法是手写代理。
【讨论】:
【参考方案7】:由于相同的原产地政策,您不能这样做。一种解决方法是使用 Flash AJAX jQuery 插件http://flxhr.flensed.com/,它使用 Flash 电影绕过同源策略。
其他选项是通过您自己的域代理请求或使用 JSONP。
【讨论】:
【参考方案8】:如果您有权访问要从中加载资源/数据的服务器,则可以修改服务器响应的请求标头以包含
"Access-Control-Allow-Origin", "*"
浏览器强制执行的同源策略 - 据我所知,根据浏览器的不同严格程度不同 - (部分?)基于响应标头的值。
我在尝试从 web 服务加载 json 时遇到了同样的问题。我发现的所有 JS hacks 都没有真正起作用,我想知道为什么我必须这样做,如果我想从我自己控制(和信任)的服务器加载数据。然后我了解到服务器的响应头在整个问题中起着至关重要的作用。当我将上述标头添加到我的 web 服务的 http 响应时,问题就解决了。
【讨论】:
您可以顺便用 --disable-web-security 标志启动 chrome 以使其放弃 SameOriginPolicy。这样,您还可以使用 chrome 的网络选项卡检查作为响应的一部分的标头。这在调试时帮助了我很多以上是关于JSON:如何进行跨域 JSON 调用的主要内容,如果未能解决你的问题,请参考以下文章