AngularJS - 访问http标头

时间:2013-10-18 16:24:39

标签: angularjs

我正在尝试访问我的角度控制器中的http标头但我未定义。此外,我能够看到我的角度服务中的标题响应,这在我的控制器中没有反映出来。有人可以告诉我我错过了什么吗?请参阅以下代码:

服务:

cmApp.service('supplierService', function ($http, $q) {
    this.getSuppliers = function (orderByColumn, skipRows, takeRows) {
        var deferred = $q.defer();
        $http({
            method: 'GET',
            url: 'api/supplier',
            params: { orderBy: orderByColumn, skip: skipRows, take: takeRows },
            timeout: 30000, 
            cache: false
        }).
        success(function (data, status, headers, config) {
            // any required additional processing here            
            deferred.resolve(data, status, headers, config);            
        }).
        error(function (data, status) {
            deferred.reject(data, status, headers, config);
        });
        return deferred.promise;        
    }

控制器:

   supplierService.getSuppliers($scope.orderby, $scope.skip, $scope.take)
        .then(function (data, status, headers, config) {
            **//getting undefined here.**
            $scope.totalRecords = parseInt(headers('X-TotalRowCount'));                
            $scope.suppliers = data;
        }, function (error) {
            // error handling here
        });

4 个答案:

答案 0 :(得分:18)

我自己找到了解决方案。我所要做的就是创建一个数组并将所有这些值添加到相同的&将其返回给控制器。请参阅以下更新的代码:

服务:

cmApp.service('supplierService', function ($http, $q) {
    this.getSuppliers = function (orderByColumn, skipRows, takeRows) {
        var deferred = $q.defer();
        $http({
            method: 'GET',
            url: 'api/supplier',
            params: { orderBy: orderByColumn, skip: skipRows, take: takeRows },
            timeout: 30000, 
            cache: false
        }).
        success(function (data, status, headers, config) {
            // any required additional processing here 
            var results = [];
            results.data = data;
            results.headers = headers();
            results.status = status;
            results.config = config;

            deferred.resolve(results);            
        }).
        error(function (data, status) {
            deferred.reject(data, status, headers, config);
        });
        return deferred.promise;        
    }

控制器:

supplierService.getSuppliers($scope.orderby, $scope.skip, $scope.take)
            .then(function (response) {                
                $scope.suppliers = response.data;
                $scope.totalRecords = parseInt(response.headers["x-totalrowcount"]);                
            }, function (error) {
                // error handling here
            });

答案 1 :(得分:6)

这个问题很旧,但$ http()会返回一个promise本身。您可以从您的服务中返回,无需创建新的承诺。你甚至可以在使用.success()和.error()之后执行此操作,或者即使在使用.then()之后,它们也会继续链接。

答案 2 :(得分:2)

自定义标头将在同一个域中显示。但是,对于跨域情况,服务器必须发送Access-Control-Expose-Headers:X-Foo,并将跨域属性作为* ...标头,以使自定义标头可见。

答案 3 :(得分:1)

我必须从我的Rest服务的响应 标题访问令牌 TokenExpiry 时间,然后存储它在我的 $ rootScope 中。 这是我使用的代码:

                $scope.Authenticate=function(){
                  var EncDecUserPass=decodeURIComponent(encodeURIComponent($scope.LoggedUserName+':'+$scope.LoggedUserPassword))  ;
                  $http(
                    {method: 'GET',
                     url: 'http://localhost:53256/api/Products/Authenticate',
                     cache: false,
                     headers:{'Authorization':'Basic '+window.btoa(EncDecUserPass)}
                   }
                   ).success(function(data, status, headers, config) {
                      //Here it goes
                      $rootScope.token=headers().token;
                      $rootScope.tokenExpirySec=headers().tokenexpiry;
                  }).error(function(data, status, headers, config) {
                    alert('Invalid User');
                  });
                }