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 支持。)

1234563 @ 作为代理。它确实支持CORSJSONP,甚至可以翻译数据格式、选择部分数据等。 (请注意,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 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?

mui ajax登录怎么跨域

我的回调不适用于跨域的 json 数据

什么是跨域及如何解决json和jsonp

怎么解决跨域问题

为啥有些跨域 JSON 请求会失败,而有些则不会?