我正在组装我的第一个 AngularJS 应用程序。我的 Controller 正在调用 $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。
我还设置了一个“node express”web 服务器,运行在我的 webapp 的根目录下,因此它将为 webapp 中的文件请求提供服务,但是对 REST 服务的任何调用都会被 302 重定向到另一个域上的服务.
当我在 Firebug 中调试它时,我看到它得到 302,然后我看到它得到 200,所以它显然遵循了重定向。然而,它随后在“错误”方法中遇到了断点,仍然说它得到了 404。换句话说,我得到了完全相同的结果。我糊涂了。
更新:
这是我稍微省略的“快速服务器”配置:
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);
最佳答案
我认为您遇到错误是因为您向不同的域发出了违反同源策略 ( http://en.wikipedia.org/wiki/Same-origin_policy ) 的请求。相反,您应该向您自己域上的服务器发出请求,并让该服务器提供您需要的数据(可能通过从其他域缓存它)。或者您可以使用 JSON-P 并让您调用的其他域在您的客户端调用一个方法。
更新
因此,为了创建 express 服务器,我们首先使用 http
库发出一个 request
来获取我们想要的 json 数据,并将响应存储在变量 数据
。然后我们像你一样设置我们的网络服务器,除了我们用数据本身响应重定向而不是响应。
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);
注意我还不能测试这一切,所以你可能需要做一些调整,但我已经用 Node、Express 和 Angular 做了非常相似的事情,我确信这一点类型的东西会起作用。您可能希望通过将请求放入 setTimeout 或在 app.get 方法中按需发出请求来调整数据在服务器上缓存的频率(但这会更慢)。您可以在此处阅读有关 http.request() 的更多信息:http://nodejs.org/api/http.html#http_http_request_options_callback
关于javascript - 无法让简单的 AngularJS $http 调用工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21655475/