如何在运行时从 AngularJS 控制器更新常见的 HTTP 标头,例如$httpProvider.defaults.headers.common['Authorization']
?它似乎$httpProvider
只能从配置模块访问,但我需要为来自控制器的所有未来请求或控制器调用的服务更新通用 HTTP 标头。
我可以通过注入控制器来更新下一个请求的本地范围标头$http
,但我需要为所有未来的请求更新 HTTP 标头,特别是基本身份验证。
如何在运行时从 AngularJS 控制器更新常见的 HTTP 标头,例如$httpProvider.defaults.headers.common['Authorization']
?它似乎$httpProvider
只能从配置模块访问,但我需要为来自控制器的所有未来请求或控制器调用的服务更新通用 HTTP 标头。
我可以通过注入控制器来更新下一个请求的本地范围标头$http
,但我需要为所有未来的请求更新 HTTP 标头,特别是基本身份验证。
不确定它何时出现在 Angular 中,但 20 个月后,您可以选择在运行时直接在 $http 对象上定义默认标头。
来自$http 文档:设置 HTTP 标头
$http.defaults.headers.common.Authorization = 'Basic dXNlcjpwYXNzd29yZA=='
当我不得不使用 API 时,我曾经使用过这种策略。我创建了一个XYZApiService
来包装对该 API 的所有请求。
这是一个简单的例子:
var app = angular.module('myApp', []);
app.controller('MainCtrl', function($scope, HttpWrapper) {
$scope.movies = [];
HttpWrapper.setAuthorization('Basic dXNlcjpwYXNzd29yZA==');
HttpWrapper.http({
method: 'get',
url: 'movies.json'
}, function(data, status){
$scope.movies = data;
}, function(data, status){
console.log('error', data, status);
})
});
app.run();
app.factory('HttpWrapper', function($http) {
var authorization = null;
return {
setAuthorization: function(auth){
authorization = auth;
},
http: function(options, successCallback, errorCallback){
if(authorization){
options.headers = options.headers || {};
options.headers.authorization = authorization;
}
console.log(options);
$http(options).success(successCallback).error(errorCallback);
}
}
});
你可以在这里在 Plunker 中尝试: