2015-04-01 3 views
0
$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

'$ http' контекст внутри контроллера подобен локальной переменной в контроллере и при внесении изменений в него не повлияет глобально –

+0

Как я могу изменить его, чтобы он затрагивался в глобальном масштабе? – Shamoon

+0

Чтобы быть честным, проще и удобнее переносить '$ http' в пользовательскую службу, например. 'request', а затем установите для него переменную. – Sulthan

ответ

1

Вы должны установить заголовки по умолчанию в методе config, а не в service.

Пример:

myApp.config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8'; 
}]); 

Только в config вы можете настроить httpProvider. Если вы попытаетесь сделать это в своем сервисе, это не повлияет на услугу $httpProvider.

EDIT:

Вы должны использовать перехватчики в этом сценарии.

Для целей глобальной обработки ошибок, аутентификации или любого вида синхронной или асинхронной предварительной обработки запроса или постобработки ответов, то желательно, чтобы иметь возможность перехватывать запросов, прежде чем они будут переданы в сервер и ответы до , они передаются в код приложения, который инициировал эти запросы .

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'); 
+0

Но я получаю только токен, который хочу установить в заголовке в качестве ответа в контроллере. – Shamoon

+0

Используйте перехватчик в этом случае – mohamedrias

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'); 
    }] 
    } 
}) 
+1

Я предполагаю, что перехватчики являются лучший подход для этого сценария – mohamedrias

+0

Перехватчик @mohamedrias - тоже хорошая идея, но он может обмениваться данными, используя одноэлементное обслуживание. –

Смежные вопросы