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
});
Ответы
Ответ 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');
});
}