Angular REST 不能 return 简单数据

Angular REST cannot return simple data

我正在尝试让 $http REST GET 调用在我的 Appgyver 项目中正常工作,但我所做的一切似乎都不对,总是 returns 错误。

请注意 angular 应用程序最终会 运行 在移动设备上,然后连接到我的远程网络服务。

我仔细检查了我的自定义 API 是否正常工作并以多种方式正确返回数据,即:

将我的http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_termreturns数据的测试终点放入如下:

[{"tid":"1","vid":"2","name":"ACME Ltd.","description":"","format":"filtered_html","weight":"0","parent":"0","uri":"http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term/1"},{"tid":"2","vid":"2","name":"ABC Films LTD","description":"","format":"filtered_html","weight":"0","parent":"0","uri":"http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term/2"}]

即使是一个简单的 CSRF 令牌请求也会给我错误。

有人能指出我哪里出错了吗,Appgyver 站点的文档记录很差,我已经尝试了 Angular RESTful 示例,我的下面的代码基于 [=16] =]$http#setting-http-headers

请注意下面的代码基本上是 Angular.js 使用 Javascript 语法(而不是 Coffeescript),日志输出遵循代码

angular
.module('main')
.controller('LoginController', function($scope, supersonic, $http) {
    $scope.navbarTitle = "Settings";

    $scope.stoken = "Response goes here";

    $scope.processLogin = function(){
        var csrfToken;

        steroids.logger.log("START CALL: processLogin");

        // $form_login_email_address = $scope.login_email;
        // $form_login_password = $scope.login_password;

        $local_get = "http://somesite.com/quote-and-buy-performance/services/session/token";
        $hal_get_taxterm_index = "http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term";

        // $http.defaults.headers.common.contentType('application/json');

        var req = {
            method: 'GET',
            url: $hal_get_taxterm_index,
            headers: {
                'Content-Type': 'application/json'
            }
        }

        $http(req)
          .success(function(data, status, headers) {
            steroids.logger.log("Inside http.get() success");
        }).error(function(data, status, headers){
            steroids.logger.log("Inside http.get() WITH ERROR");
            steroids.logger.log('data: ' + data);
            steroids.logger.log('status: ' + status);
        }).then(function(data, status, headers){
            steroids.logger.log("Inside http.get() then");
        });

        steroids.logger.log("END CALL: processLogin");
    }

});

记录调用 steroids.logger.log

的输出
View        Time            Level   Message
main#login  16:01:55.219    info    "Inside http.get() WITH ERROR"
main#login  16:01:55.219    info    "data: null"
main#login  16:01:55.219    info    "status: 0"
main#login  16:01:55.64     info    "END CALL: processLogin"
main#login  16:01:55.64     info    "START CALL: processLogin"

如果您的 angular 的应用程序在某个域中,则必须在同一域中进行 HTTP 请求。

在您的情况下,您正在尝试跨域请求(另一个域上的请求)。然后您必须提出跨域请求。

可以看到this question.

作者使用$http.jsonp()发送跨域请求。可能还有另一种方法。

我会这样做:

将您的 http 调用分离到一个服务中。这是在 angular:

中模块化代码的一种非常标准的方法
angular.module('main').factory("SomeService", function($http) {
  return {
    get: function() {
      $http({
        url: "http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term",
        method: "GET",
        headers: {
          "Content-Type": "application/json"
        }
      }).success(function(data, status, headers, config) {
        console.log("Success!");
        console.log(data);
      }).error(function(data, status, headers, config) {
        console.log("Error!");
        console.log(status);
        console.log(data);
      });
    }
  }
})

然后要在您的控制器中使用它,只需将其包含在您的控制器声明中并像调用普通方法一样调用 get:

angular.module('main').controller('LoginController', function($scope, supersonic, SomeService) {
  $scope.navbarTitle = "Settings";
  $scope.stoken = "Response goes here";
  $scope.processLogin = function(){
    var csrfToken;
    steroids.logger.log("START CALL: processLogin");

    SomeService.get();

    steroids.logger.log("END CALL: processLogin");
  }
})

执行此操作,然后反馈您的结果,我们可以从那里开始工作。