2014-02-09 48 views
1

我正在组装我的第一个AngularJS应用程序。我的控制器正在做一个$ http.get()调用。它使用的URL是正确的,但它最终调用了404错误方法。当我看到Firebug中请求的URL时,它更加令人困惑,并且它报告了200.我不知道认为我需要为此显示html。我无法想象这可能是相关的。

这里是我的有些省略掉的javascript:

var diagapp = angular.module("DiagApp", ['ui.bootstrap', 'ngResource']); 

diagapp.controller("DiagCtrl", ['$scope', '$interval', '$http', function($scope, $interval, $http) { 
$http({method:'GET',url:'http://<hostportandpath>/service/diagnostics/datasourceStatus.json'}) 
    .success(function (data, status, headers, config) { 
     console.log(data); 
    }) 
    .error(function (data, status, headers, config) { 
     console.log(data); 
    }); 
}]); 

我试过在“$ HTTP”行设置一个断点,然后复制并粘贴在该行引用到其他浏览器选项卡中的URL,它向我显示该服务返回的正确json。然后我从断点继续,并在“错误”方法中达到断点,并且状态为404.

我该做什么错?

更新:

我修改这使得服务调用只是相对的,所以它不违反CDP。

我还设置了一个运行在我的webapp根目录的“node express”web服务器,因此它将为webapp中的文件提供请求,但是对REST服务的任何调用都会被重定向到另一个服务域。

当我在Firebug中进行调试时,我发现它得到了302,然后我发现它得到了200,所以它显然遵循了重定向。然而,它在“错误”方法中遇到了断点,仍然说它有404.换句话说,我得到了完全相同的结果。我很困惑。

更新:

这是我稍微省略的“Express服务器”配置:

var express = require('express'); 
var app = express(); 

app.use("/", express.static(__dirname)); 
app.use(app.router); 

app.get('/FooService/*', function(req, res) { 
res.redirect(302, 'http://<hostname>' + req.path); 
}); 

app.listen(8000); 
+0

如果你的服务需要身份验证(甚至启用CORS),你可以在'$ http'配置对象中设置'withCredentials:true',它会发送一个OPTIONS预检 – calebboyd

回答

2

我想你,因为你正在做不同的域的请求违反得到一个错误同源策略http://en.wikipedia.org/wiki/Same-origin_policy)。相反,您应该向自己的域上的服务器发出请求,并让该服务器提供您需要的数据(可能通过从其他域中缓存该数据)。或者您可以使用JSON-P,并将您的调用的其他域称为客户端的一种方法。

更新

所以创建Express服务器,我们首先使用http库做出request得到我们想要的JSON数据,我们存储在变量data的响应。然后,我们就像你所做的那样设置我们的网络服务器,而不是用我们用数据本身作出响应的重定向来响应。

var express = require('express'); 
var http = require("http"); 
var app = express(); 
var data; 

// Make the request to buffer the data 
var options = { 
    host: 'somesite.com', 
    port: 1337, 
    path: '/some/path', 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

var req = http.request(options, function(res) 
{ 
    var output = ''; 

    res.on('data', function (chunk) { 
     output += chunk; 
    }); 

    res.on('end', function() { 
     data = JSON.parse(output); 
    }); 
}); 

req.on('error', function(err) { 
    //res.send('error: ' + err.message); 
}); 

req.end(); 

// Start the webserver to respond with the data 

app.use("/", express.static(__dirname)); 
app.use(app.router); 

app.get('/FooService/*', function(req, res) { 
    response.writeHead(200, { 'Content-Type': 'application/json'}); 
     response.end(data); 
}); 

app.listen(8000); 

我一直无法测试这一切又是那么你可能需要做一些调整,但我已经与节点,快速和角度做得非常类似的事情,我相信这种类型的东西将工作。您可能希望通过将请求置于setTimeout中或在app.get方法中按需提出请求(但速度较慢)来调整数据缓存在服务器上的频率。你可以阅读关于http的更多信息。请求()在这里:http://nodejs.org/api/http.html#http_http_request_options_callback

+0

好吧,我我熟悉同源策略,我想我有一些错觉,认为$ http可以解决这个问题。我想我会看看使用“节点快车”或其他方式来构建一个简单的可配置代理。 –

+0

好的,所以我做了一大堆工作来设置一个“node express”web服务器,所以它将服务于我的webapp的本地文件,但是将调用的相对路径重定向到REST服务的相对路径, 。我用“wget”对原始调用进行了测试,并且它工作正常。在Firebug中,我看到它获得了302,然后是200,然后它成为了“错误”方法中的断点,并显示了404。我将它作为一个相对路径,并将其设置为可以调用实际服务,但是结果是一样的。由于某些原因我无法理解,它打错了方法。 –

+0

因此,成功和错误回调被调用或只是错误?你有没有试过在js代码的同一目录下获得一个静态的json文件?也许你可以用express服务器更新问题? –