Подтвердить что ты не робот

AngularJS - доступ к http-заголовкам

Я пытаюсь получить доступ к заголовкам http в моем контроллере angular, но я получаю undefined. Кроме того, я могу видеть ответ заголовка в моей службе angular, которая не отражается в моем контроллере. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает? См. Код ниже:

Услуги:

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
        });
4b9b3361

Ответ 1

Я нашел решение самостоятельно. Все, что мне нужно сделать, это создать массив и добавить все эти значения в одно и то же и вернуть его в контроллер. См. Обновленный код ниже:

Услуги:

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

Ответ 2

Этот вопрос старый, но $http() возвращает само обещание. вы можете просто вернуть это из своего сервиса, не нужно создавать новые обещания. Вы можете сделать это даже после использования .success() и .error(), или, если на то пошло, даже после использования .then(), они сохраняют цепочку.

Ответ 3

Пользовательские заголовки будут видны в том же домене. Однако для ситуации с перекрестным сайтом сервер должен отправить Access-Control-Expose-Headers: X-Foo, а свойство cross-domain - как заголовок *..., чтобы сделать видимыми пользовательские заголовки.

Ответ 4

Мне пришлось получить доступ к Token и TokenExpiry из ответа заголовков моего сервиса Rest Rest, а затем сохранить его в моем $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');
                  });
                }