Angular2 Http Interceptor 自定義攔截器

背景需求:

  • 1.項目開發(fā)、測試敞映、發(fā)布使用的后臺發(fā)布接口均不一致禾怠,根據(jù)不同環(huán)境配置接口的host+port
  • 2.全局處理非正確的response
  • 3.每次請求前顯示loading,請求后隱藏loading(本文不涉及)

實現(xiàn):

  • 1.自定義HttpInterceptorService(http.interceptor.service.ts)

     import { Injectable } from '@angular/core';
     import { Http, Request, RequestOptionsArgs, Response, RequestOptions, ConnectionBackend, Headers } from '@angular/http';
     import 'rxjs/Rx';
     import { Observable } from 'rxjs/Observable';
     @Injectable()
     export class HttpInterceptorService extends Http {
       status = {
         "status.400": "錯誤的請求尤蒿。由于語法錯誤,該請求無法完成幅垮。",
         "status.401": "未經(jīng)授權(quán)腰池。服務(wù)器拒絕響應(yīng)。",
         "status.403": "已禁止忙芒。服務(wù)器拒絕響應(yīng)示弓。",
         "status.404": "未找到。無法找到請求的位置呵萨。",
         "status.405": "方法不被允許奏属。使用該位置不支持的請求方法進行了請求。",
         "status.406": "不可接受潮峦。服務(wù)器只生成客戶端不接受的響應(yīng)囱皿。",
         "status.407": "需要代理身份驗證∨芎迹客戶端必須先使用代理對自身進行身份驗證铆帽。",
         "status.408": "請求超時。等待請求的服務(wù)器超時德谅。",
         "status.409": "沖突爹橱。由于請求中的沖突,無法完成該請求。",
         "status.410": "過期愧驱。請求頁不再可用慰技。",
         "status.411": "長度必需。未定義“內(nèi)容長度”组砚。",
         "status.412": "前提條件不滿足吻商。請求中給定的前提條件由服務(wù)器評估為 false。",
         "status.413": "請求實體太大糟红。服務(wù)器不會接受請求艾帐,因為請求實體太大。",
         "status.414": "請求 URI 太長盆偿。服務(wù)器不會接受該請求柒爸,因為 URL 太長。",
         "status.415": "不支持的媒體類型事扭。服務(wù)器不會接受該請求捎稚,因為媒體類型不受支持。",
         "status.416": "HTTP 狀態(tài)代碼 {0}",
         "status.500": "內(nèi)部服務(wù)器錯誤求橄。",
         "status.501": "未實現(xiàn)今野。服務(wù)器不識別該請求方法,或者服務(wù)器沒有能力完成請求罐农。",
         "status.503": "服務(wù)不可用条霜。服務(wù)器當前不可用(過載或故障)。"
       };
       constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
         super(backend, defaultOptions);
       }
       request(url: string | Request, options ? : RequestOptionsArgs): Observable < Response > {
         //console.log("before...");
         //根據(jù)不同的生產(chǎn)環(huán)境配置http前綴
         typeof url=='string'? (url='http://192.168.1.205:8099/'+url):(url.url='http://192.168.1.205:8099/'+url.url);
         return this.intercept(super.request(url, options));
       }
       get(url: string, options ? : RequestOptionsArgs): Observable < Response > {
         return this.intercept(super.get(url, options));
       }
       post(url: string, body: string, options ? : RequestOptionsArgs): Observable < Response > {
         return this.intercept(super.post(url, body, this.getRequestOptionArgs(options)));
       }
       put(url: string, body: string, options ? : RequestOptionsArgs): Observable < Response > {
         return this.intercept(super.put(url, body, this.getRequestOptionArgs(options)));
       }
       delete(url: string, options ? : RequestOptionsArgs): Observable < Response > {
         return this.intercept(super.put(url, this.getRequestOptionArgs(options)));
       }
       getRequestOptionArgs(options ? : RequestOptionsArgs): RequestOptionsArgs {
         if (options == null) {
           options = new RequestOptions();
         }
         if (options.headers == null) {
           options.headers = new Headers();
         }
         options.headers.append('Content-Type', 'application/json');
         return options;
       }
       intercept(observable: Observable < Response > ): Observable < Response > {
         //console.log("after...");
         return observable.catch((err, source) => {
           if (err.status<200 || err.status>=300) {
             alert('網(wǎng)絡(luò)錯誤:'+err.status+' - '+this.status['status.'+err.status]);
             return Observable.empty();
           } else {
             return Observable.throw(err);
           }
         });
       }
     }
    
  • 2.在app.module.ts中provide

     import { NgModule }      from '@angular/core';
     import { BrowserModule } from '@angular/platform-browser';
     import { FormsModule }   from '@angular/forms';
     import { Http, HttpModule, XHRBackend, RequestOptions }    from '@angular/http';
     import { RouterModule, Routes } from '@angular/router';
     import { MessagesModule, GrowlModule, ConfirmDialogModule, ConfirmationService, DialogModule, BlockUIModule } from 'primeng/primeng';
     
     import { AppComponent }  from './app.component';
     
     import { HttpInterceptorService }   from './shared/http.interceptor.service';
     
     export function interceptorFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions){
       let service = new HttpInterceptorService(xhrBackend, requestOptions);
       return service;
     }
     
     @NgModule({
       imports:      [
         BrowserModule,
         FormsModule,
         HttpModule,
         RouterModule.forRoot(appRoutes),
         LoginModule,
         FrameModule,
         MessagesModule, GrowlModule, ConfirmDialogModule, DialogModule, BlockUIModule
       ],
       declarations: [ AppComponent ],
       bootstrap:    [ AppComponent ],
       providers:    [
         HttpInterceptorService,
         {
           provide: Http,
           useFactory: interceptorFactory,
           deps: [XHRBackend, RequestOptions]
         }
       ]
     })
     export class AppModule { }
    
  • 3.使用涵亏,示例:app.component.ts

      import { Component } from '@angular/core';
      import { Http }  from '@angular/http';
      @Component({
        selector: 'app-root',
        templateUrl: './app.component.html',
        styleUrls: ['./app.component.css']
      })
      export class AppComponent {
        title = 'app works!';
        constructor(private http: Http){}
      
        ngOnInit(){
          this.http.get('api/user/functions')
          .toPromise()
          .then(res => console.log(res));
        }
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛔外,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溯乒,更是在濱河造成了極大的恐慌,老刑警劉巖豹爹,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆悄,死亡現(xiàn)場離奇詭異,居然都是意外死亡臂聋,警方通過查閱死者的電腦和手機光稼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孩等,“玉大人艾君,你說我怎么就攤上這事∫薹剑” “怎么了冰垄?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長权她。 經(jīng)常有香客問我虹茶,道長逝薪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任蝴罪,我火速辦了婚禮董济,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘要门。我一直安慰自己虏肾,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布欢搜。 她就那樣靜靜地躺著封豪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狂巢。 梳的紋絲不亂的頭發(fā)上撑毛,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音唧领,去河邊找鬼藻雌。 笑死,一個胖子當著我的面吹牛斩个,可吹牛的內(nèi)容都是我干的胯杭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼受啥,長吁一口氣:“原來是場噩夢啊……” “哼做个!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滚局,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤居暖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后藤肢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體太闺,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年嘁圈,在試婚紗的時候發(fā)現(xiàn)自己被綠了省骂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡最住,死狀恐怖钞澳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涨缚,我是刑警寧澤轧粟,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響逃延,放射性物質(zhì)發(fā)生泄漏览妖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一揽祥、第九天 我趴在偏房一處隱蔽的房頂上張望讽膏。 院中可真熱鬧,春花似錦拄丰、人聲如沸府树。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奄侠。三九已至,卻和暖如春载矿,著一層夾襖步出監(jiān)牢的瞬間垄潮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工闷盔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弯洗,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓逢勾,卻偏偏與公主長得像顽决,于是被迫代替她去往敵國和親或粮。 傳聞我的和親對象是個殘疾皇子辞州,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蝙泼,服務(wù)發(fā)現(xiàn),斷路器迫摔,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會牽扯到網(wǎng)絡(luò)開發(fā)沐扳,例如說新浪微博、微信等句占,這些應(yīng)用本身可...
    lichengjin閱讀 3,672評論 2 7
  • 秋天人們依然坐在外邊迫皱,喝著咖啡,吃著點心辖众,和朋友聊著天。蘇珊為德國這股潮流感到震驚和敬。 幾年前我注意到德國的一個現(xiàn)象...
    阿好在德國閱讀 346評論 2 7
  • 今天跟同事吃飯昼弟,聊到這個話題啤它。舉例來說,對于旅游,如果只是想要出去散心变骡,隨便哪里都可以的話离赫,這就不算是渴望,...
    盒子里的妮簡閱讀 539評論 0 0