$http.post('http://localhost:7001/v1/sessions', {
data: {
username: $scope.user.username,
password: $scope.user.password,
type: 'sessions'
}
})
.then(function(response) {
if(response.data.data.token) {
$http.defaults.headers.common.Authorization = response.data.data.token;
$state.go('app.dashboard');
} else {
$scope.authError = response;
}
}, function(x) {
$scope.authError = 'Server Error';
});
我可以确认调用if
条件并且存在response.data.data.token
。
它进入app.dashboard
状态但被ui-router
拦截:
$stateProvider.state('app', {
abstract: true,
url: '/app',
templateUrl: 'tpl/app.html',
resolve: {
current_user: ['$http', function($http) {
return $http.get('http://localhost:7001/v1/users/4/entities');
}]
}
})
然而,该调用在标题中没有设置任何内容。我认为$http.defaults
会在标头中设置默认值。我做错了什么?
答案 0 :(得分:1)
您必须使用config
方法设置默认标头,而不是service
。
示例:
myApp.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
}]);
只有config
您才能配置httpProvider
。如果您尝试在服务中执行此操作,则根本不会影响$httpProvider
服务。
编辑:
在这种情况下,您必须使用拦截器。
出于全局错误处理,身份验证或任何类型的目的 请求或的同步或异步预处理 对响应进行后处理,希望能够进行拦截 在将它们交给服务器和响应之前请求 它们被移交给发起这些的应用程序代码 请求。
Refer Angular Docs 拦截器部分
只是一些示例代码:
app.service('APIInterceptor', function($rootScope, UserService) {
var service = this;
service.request = function(config) {
// check if the token is available. Once the token is available get it here from the UserService.
var access_token = UserService.getToken() || "unauthorized";
if (access_token) {
config.headers.authorization = access_token;
}
return config;
};
service.responseError = function(response) {
return response;
};
})
在config
$httpProvider.interceptors.push('APIInterceptor');
答案 1 :(得分:1)
我希望您使用一项服务来使用可共享数据。
<强>代码强>
app.service(dataService, function(){
this.data = {}
this.getData = function(){
return data;
};
this.setTokenData = function(token){
data.token = token;
}
});
现在您的代码将在设置令牌时使用dataService
if(response.data.data.token) {
dataService.setTokenData(response.data.data.token);
$http.defaults.headers.common.Authorization = dataService.data.token; //dataService.getData().token;
$state.go('app.dashboard');
} else {
$scope.authError = response;
}
然后从服务解析中你可以使用
$stateProvider.state('app', {
abstract: true,
url: '/app',
templateUrl: 'tpl/app.html',
resolve: {
current_user: ['$http', 'dataService', function($http, dataService) {
$http.defaults.headers.common.Authorization = dataService.getData().token;
return $http.get('http://localhost:7001/v1/users/4/entities');
}]
}
})