Angular REST无法返回简单数据

时间:2015-07-07 15:16:21

标签: angularjs rest steroids

我正在尝试在我的Appgyver项目中使用$ http REST GET调用,但是我做的任何事情似乎都没有,总是会返回错误。

请注意,角度应用程序最终将在移动设备上运行,然后连接到我的远程Web服务。

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

  • 从终端中的sh文件运行的硬编码cUrl请求 - 返回数据并更正200代码
  • 在POSTMAN和Firefox的SOA客户端中测试了API端点。

放入http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term的测试终点返回如下数据:

[{"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示例,我的代码基于https://docs.angularjs.org/api/ng/service/ $ http和https://docs.angularjs.org/api/ng/service/ $ HTTP#设定-HTTP报头

请注意下面的代码基本上是使用Javascript语法的Angular.js(而不是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"

2 个答案:

答案 0 :(得分:1)

如果您的角度应用位于特定域内,则必须在同一域内进行HTTP请求。

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

您可以看到this question

作者使用$http.jsonp()发送跨域请求。迁移是另一种方式。

答案 1 :(得分:1)

这就是我要做的事情:

将您的http电话分离为服务。这是以角度模块化代码的非常标准的方法:

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");
  }
})

执行此操作,然后对结果进行评论,我们可以从那里开始工作。