我无法在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]
我尝试在config
,run
,控制器和服务中设置它,但对我来说没有任何作用。提前感谢您提出任何建议。
修改 现在我有拦截器:
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
。在那之后,它没关系(和设置)。
答案 0 :(得分:4)
以下代码将允许您拦截应用程序的所有http请求 并在请求的标题中添加属性“language”
angular.module('app', ['ngRoute', 'ngResource']).run(function($http) {
$http.defaults.headers.common.language='fr-FR';
});
我们可以在http标头中添加许多属性
答案 1 :(得分:3)
如果您想修改AngularJS中的请求/响应,您应该深入阅读拦截器:
您可以调用$ http(config),其中config是每个配置的对象。 headers
有一个配置,您应该在其中放置代码:
headers - {Object} - 返回表示HTTP的字符串的字符串或函数的映射 要发送到服务器的标头。如果函数的返回值是 null,不会发送标头。
如果你谷歌关于拦截器,你会得到一个完整的博客列表,解释如何使用它,并提供示例代码,这里是一个帮助我出去的人:
答案 2 :(得分:1)
好的,所以对于任何想要做同样事情的人来说 - 拦截器是关键(非常感谢 Fals ),但问题在于$rootScope
。正如我所写的那样,当第一次调用Interceptor时,$rootScope.apiKey
尚未设置(在连续请求中,它已经设置好了)。
正确的方式(或工作方式)是将变量传递给AngularJS,而不是通过ngInit
,而是通过$window
。所以我添加了我的HTML代码:
<script>window.apiKey = 'myValue';</script>
然后将其传递给Interceptor与$rootScope
的方式完全相同 - 您可以用$rootScope
完全替换$window
中所有出现的问题,现在它正在工作 - 甚至第一次请求!
再次感谢Fals。