簡體   English   中英

從ngInit在AngularJS中全局設置自定義HTTP標頭

[英]Globally set custom HTTP header in AngularJS from ngInit

我無法設置從AngularJS中的ngInit獲取的自定義HTTP標頭。

我在html中使用ngInit設置了變量:

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

現在,我想在所有HTTP請求中使用此變量。 我試圖在app.config和控制器中設置它。

  • 如果我立即設置,則變量未定義。

  • 如果我在$scope.$watch回調函數中設置了變量,則定義了變量,但是HTTP請求沒有該標頭。

我設置標頭與:

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

(或在app.config中時通過$httpProvider ),然后通過$resource在服務中使用它。 我的代碼看起來像[this] [1]

我試圖在configrun ,controller和服務中設置它,但是對我來說什么都沒有用。 預先感謝您提供任何建議。

編輯:現在我有攔截器:

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 之后,就可以了(並設置)。

以下代碼將允許您攔截應用程序的所有http請求,並在請求的標頭中添加屬性“ language”

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

我們可以在http標頭中添加許多屬性

如果您想在AngularJS中修改請求/響應,則應深入了解Interceptor

您可以調用$ http(config),其中config是每個配置的對象。 headers有一個配置,您應該在其中放置代碼:

標頭– {Object} –字符串或函數的映射,這些字符串或函數返回表示HTTP標頭的字符串以發送到服務器。 如果函數的返回值為null,則不會發送標頭。

如果您搜索有關Interceptor的信息,則將獲得完整的博客列表,其中解釋了如何使用它,並提供了示例代碼,這在一段時間之前對我有幫助:

了解角度$ http攔截器

好的,所以對於任何想做同樣事情的人來說, 攔截器是關鍵(非常感謝Fals ),但是$rootScope問題是。 正如我在寫問題時所寫的那樣,當首次調用Interceptor時,尚未設置$rootScope.apiKey (在連續的請求中,它已經被設置)。

正確的方式(或工作方式 )是不通過ngInit而是通過$window將變量傳遞給AngularJS。 所以我添加了我的HTML代碼:

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

然后將其傳遞給Interceptor,方法與$rootScope完全相同-您可以用$window替換我編輯問題時出現的$rootScope所有出現,並且現在可以使用-即使是第一個請求!

再次感謝您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM