我正在尝试将$.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
答案 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
个请求,并且需要在客户端进行稍微复杂的编码。