javascript - 无法让简单的 AngularJS $http 调用工作

标签 javascript angularjs

我正在组装我的第一个 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/

相关文章:

AngularJS 两个指令与同一元素上的模板

javascript - 如何在 AngularJS 中使用三个输入来 POST 表单

javascript - AngularJS - 为什么不替换 : true work with templateUrl property?

angularjs - 从父 Controller 调用子 Controller 中的函数

javascript - 如何使用svg g实现可折叠树结构

javascript - 如何在模型和输入框之间有不同的值(Angular 5)

javascript - 无法将 javascript 放入 if else 语句中

javascript - 是否有 LayoutAnimation.Types 和 LayoutAnimation.Properties 的可用选项列表?

javascript - 当标签内有表单元素时,使用查询更改标签

javascript - AngularJS Typeahead 回调函数