Javascript Can';无法让简单的AngularJS$http调用正常工作
我正在组装我的第一个AngularJS应用程序。我的控制器正在进行$http.get()调用。它所使用的url是正确的,但它最终用404调用“error”方法。当我在Firebug中看到请求的URL时,这就更加令人困惑了,它报告了一个200 我认为我不需要为此显示html。我无法想象这有什么关系 以下是我略带删节的javascript:Javascript Can';无法让简单的AngularJS$http调用正常工作,javascript,angularjs,Javascript,Angularjs,我正在组装我的第一个AngularJS应用程序。我的控制器正在进行$http.get()调用。它所使用的url是正确的,但它最终用404调用“error”方法。当我在Firebug中看到请求的URL时,这就更加令人困惑了,它报告了一个200 我认为我不需要为此显示html。我无法想象这有什么关系 以下是我略带删节的javascript: var diagapp = angular.module("DiagApp", ['ui.bootstrap', 'ngResource']); diagap
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);
});
}]);
var diagapp=angular.module(“diagapp”,“ui.bootstrap”,“ngResource”);
控制器(“DiagCtrl”[“$scope”、“$interval”、“$http”,函数($scope、$interval、$http){
$http({方法:'GET',url:'http:///service/diagnostics/datasourceStatus.json'})
.success(函数(数据、状态、标题、配置){
控制台日志(数据);
})
.error(函数(数据、状态、标题、配置){
控制台日志(数据);
});
}]);
我尝试在“$http”行设置断点,然后将该行上引用的URL复制并粘贴到另一个浏览器选项卡中,它向我显示了该服务返回的正确json。然后我从断点继续,它在“error”方法中命中断点,状态为404
我可能做错了什么
更新:
我对其进行了修改,使服务调用仅为相对调用,因此不会违反CDP
我还设置了一个“node express”web服务器,在我的webapp根目录下运行,因此它将为webapp中的文件请求提供服务,但对REST服务的任何调用都会被302重定向到另一个域上的服务
当我在Firebug中调试它时,我看到它得到了302,然后我看到它得到了200,所以它显然遵循了重定向。然而,它随后在“error”方法中命中了断点,仍然说它得到了404。换句话说,我得到了完全相同的结果。我糊涂了
更新:
以下是我略为省略的“express server”配置:
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);
var express=require('express');
var-app=express();
app.use(“/”,express.static(_dirname));
应用程序使用(应用程序路由器);
app.get('/FooService/*',函数(req,res){
res.redirect(302,'http://'+req.path);
});
app.listen(8000);
我认为您遇到了一个错误,因为您向另一个域发出的请求违反了同源策略。相反,您应该向您自己域上的服务器发出请求,并让该服务器提供您所需的数据(可能通过从其他域缓存数据)。或者,您可以使用JSON-P,让另一个域调用客户端的方法
更新
因此,为了创建express服务器,我们首先使用http
库发出请求
,以获取所需的json数据,并将响应存储在变量data
中。然后,我们像您一样设置我们的Web服务器,只是我们用数据本身来响应,而不是用重定向来响应
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()的更多信息:如果您的服务需要任何类型的身份验证(甚至启用了CORS),您可以在
$http
config对象中设置with credentials:true
,它将发送选项preflightOk,我熟悉同源策略,我想我有一种错觉,$http可以绕过它。我想我将考虑使用“node express”或其他一些方法来构建一个简单的可配置代理。好的,我做了大量工作来设置“node express”web服务器,这样它就可以从我的webapp中服务本地文件,但将调用重定向到REST服务的相对路径,再重定向到一个可以提供该服务的服务器。我用“wget”的原始调用对此进行了测试,结果很好。在Firebug中,我看到它得到302,然后是200,然后是显示404的“error”方法中的断点。我将其设置为一个相对路径,并将其设置为可以调用实际服务,但结果是相同的。由于某种我不理解的原因,它命中了error方法。那么是调用success和error回调还是只调用error?您是否尝试过在与js代码相同的目录中获取静态json文件?也许你可以用express服务器更新这个问题?只调用错误回调。我会用我的express服务器配置更新帖子。啊,我明白了。是的,Angular正在期待一个包含某种数据的响应。用302重定向进行响应是行不通的。我用我认为你应该做的方式更新了我的答案。基本上,JSON数据需要来自您的服务器。