JSON:如何进行跨域JSON调用

时间:2011-04-05 08:19:16

标签: jquery json cross-domain

我尝试在本地网络中运行以下jquery代码。

 $.ajax({
     type: "GET",
     url: "http://SomeSite/MyUrl/",
     cache: false,
     data: { ... },
     dataType: "json",

     error: function (xhr, status, error) {
                                    ... 
     },
     success: function (json) {
                                    ...
     });

一切正常,直到“SomeSite”是localhost。我的意思是从下载页面的同一台服务器。

但是当'SomeSite'是另一个(不是localhost)网站时,它看起来像请求挂起。不是“错误”,也不是“成功”回调函数。如何使此代码有效?

提前谢谢!

8 个答案:

答案 0 :(得分:16)

我有同样的问题。试图从服务器获取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/

答案 1 :(得分:7)

您是否有服务器访问'SomeSite',或者它是第三方?

  • 如果您有权限,可以在其上启用CORS wphome 。在最简单的形式(数据不是会话敏感),只需添加标题:Access-Control-Allow-Origin: *

  • 如果您无权访问,您是否知道它是否支持JSONP wpso ?这通常涉及在URL中传递至少callback个参数。 (当然,如果您有权限,也可以添加JSONP支持。)

  • 如果您无权更改“SomeSite”并且既不支持CORS也不支持JSONP,则可以使用YQL wphome 作为代理。它支持CORSJSONP,甚至可以翻译数据格式,选择部分数据等。
    (请注意,YQL尊重robots.txt,因此如果它是限制自动访问的第三方网站,您可能仍然不幸。)

答案 2 :(得分:2)

我有类似的问题。我尝试了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,问题就消失了。

答案 3 :(得分:1)

您可以尝试jsonp request http://api.jquery.com/jQuery.ajax/查看crossdomain

答案 4 :(得分:1)

请查看cross domain jquery ajax request。如果远程服务器支持JSONP,那么我猜你可以使用回调。

答案 5 :(得分:1)

实际上你只能打电话给GET 没有通过跨站点脚本调用POST,PUT,DELETE或PATCH的故障保护方式 唯一可行的方法是手写代理。

答案 6 :(得分:1)

由于原始政策相同,您无法执行此操作。一种解决方法是使用Flash AJAX jQuery插件http://flxhr.flensed.com/,它使用Flash电影来绕过同源策略。

其他选项是通过您自己的域代理请求或使用JSONP。

答案 7 :(得分:1)

如果您有权访问要从中加载资源/数据的服务器,则可以修改服务器响应的请求标头以包含

“Access-Control-Allow-Origin”,“*”

浏览器强制执行的同源策略 - 据我所知,根据浏览器的不同程度的严格程度 - (部分?)基于响应标头的值。

尝试从Web服务加载json时遇到了同样的问题。我找到的所有JS黑客攻击并没有真正起作用,我想知道为什么我甚至不得不这样做,如果我想从我自己控制(和信任)的服务器加载数据。然后我了解到服务器的响应头在整个问题中起着至关重要的作用。当我将上面提到的标题添加到我的webservice的http响应时,问题就解决了。