Jquery:带有不同url端口的$ .getJSON

时间:2013-11-26 20:00:17

标签: javascript jquery ajax json

我正在尝试将$.getJSON与本地应用程序一起使用,在另一个端口上调用另一个本地应用程序。 例如,我的应用程序正在localhost:3000上运行,但我希望对$.getJSON上运行的另一个应用程序进行localhost:3001调用,在firebug中,它返回红色,响应为200,但没有数据在回应中。有没有办法做到这一点?我试过了......

 $.getJSON('http://localhost:3001/dashboard/widgets/marketing_efficiency_gauge.json',
 {   key: 'value' }, function(data){

 alert(data)

  });

编辑:为清楚起见,localhost上有两个rails应用程序:localhost上有3000个另一个:3001

第二次编辑:这是localhost的json响应:3001当我用浏览器点击它时(比如firefox)https://gist.github.com/willfults/7665299

1 个答案:

答案 0 :(得分:5)

Same Origin Policy阻止JavaScript脚本向不同的域发出HTTP请求。出于SOP的目的,具有相同主机名但不同端口的URL(如此处所示)仍被视为不同的域,因此不允许请求。

在这种情况下通常会发生的情况是浏览器确实通过网络发出请求,但会丢弃响应并将错误结果发送给JavaScript。

要解决此问题,您需要在localhost:3001服务上实施Cross-Origin Resource Sharing。简而言之,这需要在响应中添加Access-Control-Allow-Origin标头,列出允许向服务发出跨域请求的域。也就是说,在这种情况下,为Access-Control-Allow-Origin: localhost:3000服务的响应添加localhost:3001标头应该可以让事情按预期工作。

顺便提一下,这就是浏览器发出请求但会丢弃结果的原因:它需要从服务器请求标头以确定是否允许JavaScript发出请求(即需要检查是否存在请求)响应中的Access-Control-Allow-Origin标头)。为什么HEAD请求不够,我不知道。

另一种选择是使用JSONP。这在服务器端实现起来可能更简单,但缺点是只能处理GET个请求,并且需要在客户端进行稍微复杂的编码。