Установите заголовок по умолчанию на AngularJS, но не используйте его по одному конкретному запросу

Для отправки токена OAuth2 я настраиваю заголовок по умолчанию на AngularJS следующим образом:

$http.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;

Это отлично работает, но мне не нужен этот заголовок (я получаю сообщение об ошибке) для одного конкретного запроса.

Есть ли способ исключить заголовок по умолчанию при выполнении этого запроса?

Спасибо!

решаемые

Благодаря Riron за то, что вы на правильном пути. Вот ответ:

$http({
    method: 'GET',
    url: 'http://.../',

    transformRequest: function(data, headersGetter) {
        var headers = headersGetter();

        delete headers['Authorization'];

        return headers;
    }
});

Ответ 1

Когда вы совершаете свой вызов с помощью $http, вы можете переопределять заголовки по умолчанию, предоставляя их непосредственно в конфигурации вашего запроса:

$http({method: 'GET', url: '/someUrl', headers: {'Authorization' : 'NewValue'} }).success();

В противном случае вы можете преобразовать свой запрос с помощью параметра transformRequest, все еще находящегося в вашем конфиге $http. См. Документ:

transformRequest - {function(data,headersGetter)|Array.<function(data, headersGetter)>} - преобразование функции или массива таких функций. Функция преобразования принимает тело запроса HTTP и заголовки и возвращает его преобразованное (обычно сериализованной) версии.

Таким образом вы можете удалить заголовок для одного запроса до его отправки:

$http({method: 'GET', 
       url: '/someUrl', 
       transformRequest: function(data,headersGetter){ //Headers change here } 
}).success();

Ответ 2

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

В документах Angular для службы $http действительно есть эта точная ситуация:

Чтобы явно удалить заголовок, автоматически добавленный через $httpProvider.defaults.headers для каждого запроса, используйте заголовки свойство, установив желаемый заголовок на undefined. Например:

 var req = {  
      method: 'POST',  
      url: 'http://example.com',  
      headers: {  
           'Content-Type': undefined  
      },  
      data: { 
           test: 'test' 
      } 
 }

 $http(req).success(function(){...}).error(function(){...});

Ответ 3

Angular 1.4.0 больше не может изменять заголовки запросов с помощью transformRequest:

Если нужно динамически добавлять/удалять заголовки, это нужно сделать в функция заголовка, например:

$http.get(url, {
  headers: {
    'X-MY_HEADER': function(config) {
      return 'abcd'; //you've got access to a request config object to specify header value dynamically
    }
  }
})

Ответ 4

В то время как $httpProvider может переопределить $http, использование intereceptors - один из способов обращения с этим, я в конечном итоге делаю это так.

function getMyStuff(blah) {

        var req = {
            method: 'GET',
            url: 'http://...',
            headers: {
                'Authorization': undefined
            }
        }
        return $http(req)
            .then(function(response) {
                return response.data;
            });


}