var app = angular.module('app', []);// 定义一个 Service ,稍等将会把它作为 Interceptors 的处理函数app.factory('HttpInterceptor', ['$q', HttpInterceptor]);function HttpInterceptor($q) { return { request: function(config){ config.headers = config.headers || {}; if ($localStorage.token) { config.headers.token = $localStorage.token; // config.headers['X-Access-Token'] = $localStorage.token; }; return config || $q.when(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); } };}// 添加对应的 Interceptorsapp.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push(HttpInterceptor);}]);
利用还是比较大略的,但是 须要把稳是拦截的要求只能是通过angular中的$http发送的要乞降相应才能被httpInterceptor拦截,ajax发送或其他办法的要求不能够被httpInterceptor拦截! ,以是当利用其他办法发送要求时,在httpInterceptor中不能被拦截的时候要清楚这一点。如果利用ajax发送要求,就须要在ajax中的success和error中单独进行处理
实际的 Interceptor 处理函数中, return 了一个包含四个成员的工具,这四个成员都 不是必须 的,可以按实际情形指定一二,分别如下:
request :吸收一个参数,它是 $http 中的标准 config 工具,同时也须要返回一个标准 config ,此时可以添加各种身份验证信息,同时也可在此启动进度条requestError :当有多个 Interceptor 的时候, requestError 会在前一个 Interceptor 抛出错误或者实行 $q.reject() 时实行,吸收的参数就对应的缺点response :接管一个要求工具参数,可以不处理就直接返回,此时也可以将进度条显示为成功完成,当然,如果后端 API 返回自定义缺点时,HTTP 的状态码仍旧是 200 得话,便在这里处理自定义缺点,也可以对返回数据做一些处理,把稳要将进度条置为完成responseError :这个是重头戏,即可以处理标准的 Http 缺点,如做事器没有相应时,或者 PHP 之类的 CGI 常常涌现的 502 一类,还可以处理 HTTP 状态码不是 200 的各种自定义缺点上面四个中,前两个是要求的前置处理,后两个是针对要求的相应的处理。