原文:http://blog.csdn.net/magiclr/article/details/49643277
在AngularJs中有三種方式可以設置請求頭信息:
1、在http服務的服務端發送請求時,也就是調用http()方法時,在config對象中設置請求頭信息:
$http.post('/somePath' , someData , {
headers : {'Authorization' : authToken}
}).success(function(data, status, headers, config) {
//...
}).error(function(data, status, headers, config ) {
//...
});
這種方法的好處是針對不同路徑的請求,可以個性化配置請求頭部;
缺點就是,不同路徑請求都需要單獨配置。
2、第二種設置請求頭信息的方式就是在$httpProvider.defaults.headers屬性上直接配置。
angular.module('app', [])
.config(function($httpProvider) {
$httpProvider.defaults.headers.common = { 'My-Header' : 'value' }
})
$httpProvider.defaults.headers有不同的屬性,如common、get、post、put等。因此可以在不同的http請求上面添加不同的頭信息,common是指所有的請求方式。
這種方式添加請求頭信息的優勢就是可以給不同請求方式添加相同的請求頭信息;
缺點就是不能夠為某些請求path添加個性化頭信息。
3、第三種設置請求頭信息的地方是$httpProvider.interceptors。也就是為請求或響應注冊一個攔截器。使用這種方式首先需要定義一個服務。
myModule.factory('authInterceptor', function($rootScope, $cookies){
return {
request: function(config){
config.headers = config.headers || {};
if($cookies.get('token')){
config.headers.authorization = 'Bearer ' + $cookies.get('token');
}
return config;
},
responseError: function(response){
// ...
}
};
})
然后把上面定義的服務注冊到$httpProvider.interceptors中。
.config(function($httpProvider){ $httpProvider.interceptors.push('authInterceptor'); })
這樣,對於每次請求,不論是get還是post、put。我們都會在請求頭信息中加入authorization屬性。這種方式在處理驗權、授權方面很有用的。缺點就是不能夠為特定的請求方式添加請求頭信息。
下面詳細介紹下第三種方法:
AngularJS 提供了 Interceptors ——攔截戰斗機——來對應用內所有的 XHR 請求進行統一處理。
主要功能
Interceptors 有兩個處理時機,分別是:
- 其它程序代碼執行 HTTP 請求之后,在實際從瀏覽器發出請求之前,即處理請求
- 得到請求的響應之后,在交給其它程序代碼處理之前,即處理請求的響應
所以,不難理解它可以用於如下幾個方面:
- 全局處理錯誤
- 統一進行身份驗證一類的處理
- 對所有發出去的請求進行預處理
- 對所有收到的響應進行預處理
- 做一些增強用戶體驗的操作,例如顯示一個進度條
var app = angular.module('app', []); // 定義一個 Service ,稍等將會把它作為 Interceptors 的處理函數 app.factory('HttpInterceptor', ['$q', HttpInterceptor]); function HttpInterceptor($q) { return { request: function(config){ return config; }, requestError: function(err){ return $q.reject(err); }, response: function(res){ return res; }, responseError: function(err){ if(-1 === err.status) { // 遠程服務器無響應 } else if(500 === err.status) { // 處理各類自定義錯誤 } else if(501 === err.status) { // ... } return $q.reject(err); } }; } // 添加對應的 Interceptors app.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push(HttpInterceptor); }]);
實際的 Interceptor 處理函數中, return 了一個包含四個成員的對象,這四個成員都 不是必須 的,可以按實際情況指定一二,分別如下:
request:接收一個參數,它是$http中的標准 config 對象,同時也需要返回一個標准config,此時可以添加各類身份驗證信息,同時也可在此啟動進度條,config.headers是一個標准的頭部,可以獲取config.headers設置其頭部,然后返回這個config。requestError:當有多個 Interceptor 的時候,requestError會在前一個 Interceptor 拋出錯誤或者執行$q.reject()時執行,接收的參數就對應的錯誤response:接受一個請求對象參數,可以不處理就直接返回,此時也可以將進度條顯示為成功完成,當然,如果后端 API 返回自定義錯誤時,HTTP 的狀態碼仍然是 200 得話,便在這里處理自定義錯誤,也可以對返回數據做一些處理,注意要將進度條置為完成responseError:這個是重頭戲,即可以處理標准的 Http 錯誤,如服務器沒有響應時,或者 PHP 之類的 CGI 經常出現的 502 一類,還可以處理 HTTP 狀態碼不是 200 的各類自定義錯誤
上面四個中,前兩個是請求的前置處理,后兩個是針對請求的響應的處理。
轉自:http://www.tuicool.com/articles/eMZBN3
