从ngInit全局设置AngularJS中的自定义HTTP头

时间:2013-11-20 17:20:15

标签: javascript http rest angularjs basic-authentication

我无法在AngularJS中设置从ngInit获取的自定义HTTP标头。

我在html中使用ngInit设置变量:

<div ng-init="myApiKey='valueOfVar'"></div>

现在我想在所有HTTP请求中使用此变量。我试着在app.config和控制器中设置它。

  • 如果我立即设置,变量是未定义的。

  • 如果我在$scope.$watch回调函数中设置它,变量是 已定义,但HTTP请求没有该标头。

我设置标题为:

$http.defaults.headers.common.Authorization = 'something';

(或通过$httpProvider,在app.config中),然后在使用$resource的服务中使用它。我的代码看起来像[this] [1]

我尝试在configrun,控制器和服务中设置它,但对我来说没有任何作用。提前感谢您提出任何建议。

修改 现在我有拦截器:

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

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

$rootscope.apiKey(在主控制器中设置)在第一次调用时为undefined。在那之后,它没关系(和设置)。

3 个答案:

答案 0 :(得分:4)

以下代码将允许您拦截应用程序的所有http请求 并在请求的标题中添加属性“language”

angular.module('app', ['ngRoute', 'ngResource']).run(function($http) {
  $http.defaults.headers.common.language='fr-FR';
});

我们可以在http标头中添加许多属性

答案 1 :(得分:3)

如果您想修改AngularJS中的请求/响应,您应该深入阅读拦截器

  • Angular JS网站:$http

您可以调用$ http(config),其中config是每个配置的对象。 headers有一个配置,您应该在其中放置代码:

  

headers - {Object} - 返回表示HTTP的字符串的字符串或函数的映射   要发送到服务器的标头。如果函数的返回值是   null,不会发送标头。

如果你谷歌关于拦截器,你会得到一个完整的博客列表,解释如何使用它,并提供示例代码,这里是一个帮助我出去的人:

Understanding angular $http interceptors

答案 2 :(得分:1)

好的,所以对于任何想要做同样事情的人来说 - 拦截器是关键(非常感谢 Fals ),但问题在于$rootScope 。正如我所写的那样,当第一次调用Interceptor时,$rootScope.apiKey尚未设置(在连续请求中,它已经设置好了)。

正确的方式(或工作方式)是将变量传递给AngularJS,而不是通过ngInit,而是通过$window。所以我添加了我的HTML代码:

<script>window.apiKey = 'myValue';</script>

然后将其传递给Interceptor与$rootScope的方式完全相同 - 您可以用$rootScope完全替换$window中所有出现的问题,现在它正在工作 - 甚至第一次请求!

再次感谢Fals。