亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解AngularJS中的http攔截

 更新時(shí)間:2016年02月09日 15:55:24   作者:Darren Ji  
這篇文章主要為大家詳細(xì)介紹了AngularJS中的http攔截,$http服務(wù)允許我們與服務(wù)端交互,有時(shí)候我們希望在發(fā)出請(qǐng)求之前以及收到響應(yīng)之后做些事情。即http攔截,需要的朋友可以參考下

http攔截,即$http服務(wù)允許我們與服務(wù)端交互,有時(shí)候我們希望在發(fā)出請(qǐng)求之前以及收到響應(yīng)之后做些事情。
$httpProvider包含了一個(gè)interceptors的數(shù)組。

我們這樣創(chuàng)建一個(gè)interceptor。

app.factory('myInterceptor', ['$log', function($log){
  $log.debug('');
  
  var myInterceptor = {};
  
  return myInterceptor;
}])

接著注冊(cè)interceptor. 

app.config(['$httpProvider', function($httpProvider){
  $httpProvider.interceptors.push('myInterceptor');
}])
 

以下是$http攔截的一些例子。

■ 攔截器中的異步操作

app.factory('myInterceotpr','someAsyncServcie', function($q, someAsyncServcie){
  var requestInterceptor = {
    request: function(config){
      var deferred = %q.defer();
      someAsyncService.doAsyncOperation().then(function(){
        ...
        deferred.resolve(config);
      }, function(){
        ...
        deferred.resolve(config);
      })
      return deferred.promise;
    }
  };
  
  return requestInterceptor;
})

以上,是一個(gè)請(qǐng)求攔截,做了一個(gè)異步操作,根據(jù)異步操作的結(jié)果來更新config。

當(dāng)然也有響應(yīng)攔截。

app.factory('myInterceptor',['$q', 'someAsyncService', function($q, someAsyncSercice){
  var responseInterceptor = {
    response: function(response){
      var deferred = $q.defer();
      someAsyncService.doAsyncOperation().then(function(response){
        ...
        deferred.resolve(response);
      }, function(response){
        ...
        deferred.resolve(response);
      })
      return deferred.promise;
    }
  };
  return responseInterceptor;
}])

■ Session攔截,請(qǐng)求攔截

服務(wù)端有2種類型的驗(yàn)證,一個(gè)是基于cookie的,一種是基于token的。對(duì)于基于token驗(yàn)證,當(dāng)用戶登錄,獲取一個(gè)來自服務(wù)端的token,這個(gè)token在每一次請(qǐng)求時(shí)發(fā)送給服務(wù)端。

創(chuàng)建一個(gè)有關(guān)session的injector:

app.factory('sessionInjector',['SessionService', function(SessionService){
  var sessionInjector = {
    request: function(config){
      if(!SessionService.isAnonymous){
        config.headers['x-session-token'] = SessionService.token;
      }
      return config;
    }
  };
  
  return sessionInjector;
}])

可見,把從服務(wù)端返回的token放在了config.headers中。

注冊(cè)injector:

app.config(['$httpProvider', function($httpProvider){
  $httpProvider.interceptors.push('sessionInjector');
}])

發(fā)出一個(gè)請(qǐng)求:

$http.get('');

攔截前大致是:

{
  "transformRequest":[null],
  "transformResponse":[null],
  "method":"GET",
  "url":"",
  "headers":{
    "Accept": "application/json, text/plain,*/*"
  }
}

攔截后,在headers中多兩個(gè)一個(gè)x-session-token字段:

{
  "transformRequest":[null],
  "transformResponse":[null],
  "method":"GET",
  "url":"",
  "headers":{
    "Accept": "application/json, text/plain,*/*",
    "x-session-token":......
  }
}

■ 時(shí)間戳,請(qǐng)求和響應(yīng)攔截

app.factory('timestampMarker',[function(){
  var timestampMarker = {
    request:function(config){
      config.requestTimestamp = new Date().getTime();
      return config;
    },
    response: function(response){
      response.config.responseTimestamp = new Date().getTime();
      return config;
    }
  };
  
  return timestampMarker;
}])

以上,在請(qǐng)求和響應(yīng)時(shí)攔截,在config.requestTimestamp和config.responseTimestamp賦上當(dāng)前的時(shí)間。

注冊(cè)攔截器:

app.config(['$httpProvider', function($httpProvider){
  $httpProvider.interceptors.push('timestampMarker');
}])
 

然后在運(yùn)用的時(shí)候可以算出請(qǐng)求響應(yīng)所耗去的時(shí)間。

$http.get('').then(function(response){
  var time = response.config.responseTime - response.config.requestTimestamp;
  console.log('請(qǐng)求耗去的時(shí)間為 ' + time);
})
 



■ 請(qǐng)求錯(cuò)誤恢復(fù),請(qǐng)求攔截

模擬一個(gè)請(qǐng)求攔截的錯(cuò)誤情形:

app.factory('requestRejector',['$q', function($q){
  var requestRejector = {
    request: function(config){
      return $q.reject('requestRejector');
    }
  };
  return requestRejector;
}])

攔截請(qǐng)求錯(cuò)誤:

app.factory('requestRecoverer',['$q', function($q){
  var requestRecoverer = {
    requestError: function(rejectReason){
      if(rejectReason === 'requestRejector'){
        //恢復(fù)請(qǐng)求
        return {
          transformRequest:[],
          transformResponse:[],
          method:'GET',
          url:'',
          headers:{
            Accept:'application/json, text/plain, */*'
          }
        };
      } else {
        return $q.reject(rejectReason);
      }
    }
  };
  
  return requestRecoverer;
}])

注冊(cè)攔截器:

app.config(['$httpProvider', function($httpProvider){
  $httpProvider.interceptors.push('requestRejector');
  $httpProvider.interceptors.push('requestRecoverer');
}])
 

■ Session錯(cuò)誤恢復(fù),響應(yīng)攔截

app.factory('sessionRecoverer',['$q','$injector',function($q, $injector){
 var sessionRecoverer = {
  responseError: function(response){
   //如果Session過期
   if(response.status == 419){
    var SessionService = $injector.get('SessionService');
    var $http = $injector.get('$http');
    var deferred = $q.defer();
    
    //創(chuàng)建一個(gè)新的session
    SessionService.login().then(deferred.resolve, deferred.reject);
    
    return deferred.promise.then(function(){
     reutrn $http(response.config);
    })
   }
   return $q.reject(response);
  }
 };
 
 return sessionRecoverer;
}])

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 詳解Angular之路由基礎(chǔ)

    詳解Angular之路由基礎(chǔ)

    單頁(yè)應(yīng)用中,組件時(shí)構(gòu)建應(yīng)用的基礎(chǔ)元素,頁(yè)面展示什么內(nèi)容均是靠頁(yè)面有什么組件決定的,而展示什么組件又是由一組路由(帶有Url元素的特定集合,可用于導(dǎo)航視圖)決定的,希望本文可以幫助讀者了解路由的基礎(chǔ)概念和基礎(chǔ)使用、寫法。
    2021-05-05
  • AngularJS常見過濾器用法實(shí)例總結(jié)

    AngularJS常見過濾器用法實(shí)例總結(jié)

    這篇文章主要介紹了AngularJS常見過濾器用法,結(jié)合實(shí)例形式總結(jié)分析了AngularJS大小寫過濾器、貨幣過濾器、日期過濾器、limitTo過濾器、orderBy過濾器及自定義過濾器使用方法,需要的朋友可以參考下
    2017-07-07
  • 如何在Angular.JS中接收并下載PDF

    如何在Angular.JS中接收并下載PDF

    最近這兩天公司正在做一個(gè)PDF協(xié)議下載的功能,目前的解決方案可以分為完全前端生成和后端生成兩種方式。前端生成PDF有jsPDF 和pdfmake 兩種方式,下面這篇文章就給大家分享下如何在Angular.JS中接收并下載PDF的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • 詳解angular部署到iis出現(xiàn)404解決方案

    詳解angular部署到iis出現(xiàn)404解決方案

    這篇文章主要介紹了詳解angular部署到iis出現(xiàn)404解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 教你用AngularJS框架一行JS代碼實(shí)現(xiàn)控件驗(yàn)證效果

    教你用AngularJS框架一行JS代碼實(shí)現(xiàn)控件驗(yàn)證效果

    簡(jiǎn)單來說Angular.js是google開發(fā)者設(shè)計(jì)和開發(fā)的一套前端開發(fā)框架,幫助你簡(jiǎn)化前端開發(fā)的負(fù)擔(dān)。到底能簡(jiǎn)化到什么程度呢,今天我們來看下,一行代碼實(shí)現(xiàn)控件驗(yàn)證效果,有木有嚇尿?
    2014-06-06
  • 關(guān)于AngularJS中ng-repeat不更新視圖的解決方法

    關(guān)于AngularJS中ng-repeat不更新視圖的解決方法

    今天小編就為大家分享一篇關(guān)于AngularJS中ng-repeat不更新視圖的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • AngularJS通過ng-Img-Crop實(shí)現(xiàn)頭像截取的示例

    AngularJS通過ng-Img-Crop實(shí)現(xiàn)頭像截取的示例

    本篇文章主要介紹了AngularJS通過ng-Img-Crop實(shí)現(xiàn)頭像截取的示例,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • angular2+nodejs實(shí)現(xiàn)圖片上傳功能

    angular2+nodejs實(shí)現(xiàn)圖片上傳功能

    這篇文章主要介紹了angular2+nodejs實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • angular 基于ng-messages的表單驗(yàn)證實(shí)例

    angular 基于ng-messages的表單驗(yàn)證實(shí)例

    本篇文章主要介紹了angular 基于ng-messages的表單驗(yàn)證實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • AngularJS入門教程之模塊化操作用法示例

    AngularJS入門教程之模塊化操作用法示例

    這篇文章主要介紹了AngularJS模塊化操作用法,結(jié)合實(shí)例形式分析了AngularJS基于模塊化操作避免命名沖突的相關(guān)操作技巧,需要的朋友可以參考下
    2016-11-11

最新評(píng)論