Angular JS — добавить собственный заголовок ко всем запросам GET/POST.

Я пытаюсь использовать перехватчик, чтобы добавить заголовок «Авторизация» ко всем моим запросам GET/POST. Вот перехватчик:

myApp.factory('httpRequestInterceptor', ['$rootScope', function ($rootScope) {
  return {
    request: function ($config) {
        $config.headers['Authorization'] = 'Basic ' + $rootScope.apiKey;
        return $config;
    }
  };
}]);

Перехватчик используется в основном модуле следующим образом в части myApp.config:

$httpProvider.interceptors.push('httpRequestInterceptor');

По какой-то причине я не вижу заголовок авторизации на вкладке сети (я использую Chrome), и он не попадает на сервер, и я не получаю никаких ошибок. Запрос GET/POST в моем приложении относится к удаленному серверу, который НЕ находится в моем домене.

Любая идея, что я делаю неправильно здесь?

Решение: я нашел проблему, она была на стороне сервера - видимо, если я установил Access-Control-Allow-Headers в ответ на *, это не сработает, но если я укажу заголовки буквально это работает просто отлично.


person user1531186    schedule 01.07.2015    source источник


Ответы (4)


проблема была на стороне сервера - очевидно, установка Access-Control-Allow-Headers в ответ на * не сработала, но указание заголовков буквально на то, что мне нужно (Access-Control-Allow-Headers: Authorization) работает просто отлично .

person user1531186    schedule 01.07.2015

Вы можете использовать:

myApp.run([
  '$http', '$rootScope',
  function($http, $rootScope) {
    $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.apiKey;
  }
]);
person Johnny Ha    schedule 01.07.2015
comment
Странно, я использую что-то подобное в своем текущем приложении, и оно работает. Вот работающий jsfiddle: jsfiddle.net/epnxmkwy я вижу в инструментах chrome, который отправляет заголовок: Access-Control-Request-Headers: accept, авторизация - person Johnny Ha; 01.07.2015
comment
Когда вы устанавливаете ключ $rootScope.apiKey? - person Johnny Ha; 01.07.2015
comment
я нашел решение, см. отредактированный вопрос. Спасибо за помощь. - person user1531186; 01.07.2015
comment
Хорошо, что вы нашли проблему - person Johnny Ha; 01.07.2015

Я думаю, вы должны изменить его на

 myApp.factory('httpRequestInterceptor', ['$rootScope', function ($rootScope) {
    var injector = {
        request: function (config) {
               config.headers['Authorization'] = 'Basic ' + $rootScope.apiKey;
               return config;
        }
    };
   return injector;
    } ]);

попробуйте вот так веб-сайт

person Philip Moniaga    schedule 01.07.2015
comment
@user1531186 user1531186 вы пробовали решение, которое я отредактировал? - person Philip Moniaga; 01.07.2015
comment
я нашел решение, см. отредактированный вопрос. Спасибо за помощь. - person user1531186; 01.07.2015

Вы всегда можете сказать angular добавить заголовок, используя $httpProvider следующим образом:

myApp.config(['$httpProvider','$rootScope', function ($httpProvider, $rootScope) {
    $httpProvider.defaults.headers.common['Authorization'] = 'Basic' + $rootScope.apiKey;
}]);

Это добавит заголовок ко ВСЕМ запросам. Для получения и публикации вы можете установить: $httpProvider.defaults.headers.get['Authorization'] = ''; и $httpProvider.defaults.headers.post['Authorization'] = ''; вместо $httpProvider.defaults.headers.common['Authorization'], если вы не хотите, чтобы заголовок добавлялся ко всем запросам.

person tasty_snack    schedule 01.07.2015
comment
это тоже пробовал, не работает. также убедился, что у меня есть заголовок Access-Control-Allow-Headers в ответе, и он установлен в *. - person user1531186; 01.07.2015
comment
@ user1531186 Не могли бы вы попробовать создать скрипку, чтобы воспроизвести проблему? - person tasty_snack; 01.07.2015
comment
я нашел решение, см. отредактированный вопрос. Спасибо за помощь. - person user1531186; 01.07.2015