JSON:如何进行跨域JSON调用

我尝试在本地网络中运行以下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)网站时,它看起来像请求挂起。 不是“错误”,也不是“成功”回调函数。 如何使此代码有效?

先感谢您!

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

你有服务器访问’SomeSite’,还是第三方?

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

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

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

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

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

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

由于相同的原始政策,您无法做到这一点。 一种解决方法是使用Flash AJAX jQuery插件http://flxhr.flensed.com/ ,它使用Flash电影绕过同源策略。

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

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

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

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

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

我有一个类似的问题。 我尝试了Symba引用的代理脚本但由于某种原因它无法在我的机器上运行。 在我的情况下,我试图向同一主机上的JBoss AS上托管的应用程序发送请求。 不知怎的,JBoss的版本没有办法修改响应头,所以我可以包含“Access-Control-Allow-Origin”,“*”。

我使用上面的Symba方法解决了这个问题,但我在Apache服务器上设置了反向代理,而不是Ben Alman的脚本,请参阅http://docs.oseems.com/general/application/apache/configure-reverse-proxy 。 默认情况下,Apache仍会存在跨域问题。 通过设置响应头“Access-Control-Allow-Origin”,“*”,请参阅http://enable-cors.org/server_apache.html ,问题就消失了。