【问题标题】:JSON: How do I make cross-domain JSON callJSON:如何进行跨域 JSON 调用
【发布时间】: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”是另一个(不是本地主机)网络站点时,它看起来请求挂起。不会调用“错误”,也不会调用“成功”回调函数。我怎样才能使这段代码工作?

提前感谢您!

【问题讨论】:

  • 你在哪个浏览器上测试过?

标签: jquery json cross-domain


【解决方案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 wpso?这通常涉及在 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 的网络选项卡检查作为响应的一部分的标头。这在调试时帮助了我很多
            猜你喜欢
            • 2012-10-15
            • 2013-09-29
            • 2012-09-16
            • 2013-12-27
            • 1970-01-01
            • 2011-04-15
            • 1970-01-01
            • 2018-03-22
            • 2013-06-23
            相关资源
            最近更新 更多