AngularJS $http自定义头部用于所有请求

47

我想知道是否有办法在所有$http请求头中添加自定义信息进行配置,类似于以下的配置:

 var config = {headers: {
            'Authorization': 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==',
            'Accept': 'application/json;odata=verbose'
        }
    };

但对于我在不同服务中进行的所有 $http 调用,我相信肯定有解决方案:D。谢谢


可能是AngularJS 1.0.x中所有HTTP请求的拦截器的重复问题。 - Julien
3个回答

87

你可以创建一个$http拦截器来扩展你的头部信息:

myapp.factory('httpRequestInterceptor', function () {
  return {
    request: function (config) {

      config.headers['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==';
      config.headers['Accept'] = 'application/json;odata=verbose';

      return config;
    }
  };
});

myapp.config(function ($httpProvider) {
  $httpProvider.interceptors.push('httpRequestInterceptor');
});


可能是一个愚蠢的问题,但为什么授权令牌有前缀“Basic”? - TheLittleNaruto
这只是一个例子 :) - alexsc
4
@TheLittleNaruto "Authorization" 头部有一些默认选项,例如以 Authorization: <type> <credentials> 的形式的 Basic base64encodedStringSeperatedWithA:Bearer tokenString,这在整个互联网上是标准的。 - Dean Meehan
@DeanMeehan 谢谢。你回复并不晚,毕竟只有一年而已。 - TheLittleNaruto
2
Stackoverflow将永存,我只是想为其他搜索相同问题的人留下一些信息! :) - Dean Meehan

23

一个更简单的解决方案是使用Angular的run块:

app.run(['$http', function ($http) {
    $http.defaults.headers.common['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==';
    $http.defaults.headers.common['Accept'] = 'application/json;odata=verbose';
}]);

注意:此解决方案允许您仅传递静态值一次,因为run块仅执行一次。


8
如果用户在运行时之后登录,他将没有授权令牌,这就是为什么最好使用拦截器的问题。 - Shining Love Star
是的,我知道,但我根据问题回答了,因为作者想在所有请求中添加头文件 :-) - Shashank Agrawal
我正在尝试在Angular v1.0.6中实现这个,但是属性'common'不存在。有什么想法吗? - Jack Zach Tibbles

0
  use the folllowing code and  you can also control  $http timeout from 
 config setting.    
 'use strict';
   var app = angular.module('b2capp', []);
   var apiRequestCount = 0;      
   app.config(function ($httpProvider) {
      $httpProvider.interceptors.push(function ($rootScope, $q) {
       return {
           request: function (config) {
               apiRequestCount++;
                //   config.timeout =300000;
              return config;
          },
          response: function (response) {
               return response;
          },
           responseError: function (rejection) {
             switch (rejection.status) {
                   case 408:
                        console.log('connection timed out');
                        break;
              }
               // return $q.reject(rejection);
               return rejection;
            }
          }
       })
    });
 }]);
   app.controller('myCtrl', function ($scope, $http, $timeout) {
    var headers = {
            //'Authorization': 'Basic ' + btoa(username + ":" + password),
               'Access-Control-Allow-Origin': true,
               'Content-Type': 'application/json; charset=utf-8',
               "X-Requested-With": "XMLHttpRequest"
                 }
    $http.post(url + 'Search_6e', reqCookie, {
                   headers
            })
            .then(function Success(response) {               
                 $scope.myData = resultData;
                 console.log($scope.myData);
           }, function myError(response) {
              //error code
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接