2017-02-14 202 views
2

在角1,全局处理的HTTP响应状态与$httpProvider完成:角2 HTTP响应拦截

import { Injectable } from '@angular/core'; 
import { 
    Http, 
    Response, 
    Request, 
    RequestOptions, 
    RequestOptionsArgs, 
    XHRBackend 
} from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/throw'; 
import 'rxjs/add/operator/catch'; 

@Injectable() 
export class HttpInterceptor extends Http { 

    constructor(xhrBackend: XHRBackend, requestOptions: RequestOptions) { 
    super(xhrBackend, requestOptions); 
    } 

    private catchErrors() { 
    return (response: Response) => { 
     if (response.status === 418) { 
      // do some stuff here 
     } 
     return Observable.throw(response); 
    }; 
    } 

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    return super.request(url, options) 
      .catch(this.catchErrors()); 
    } 
} 

angular.module('app', []) 
    .service('httpResponseInterceptor', ['$q', function ($q) { 
     this.response = function (response) { 
      if (response.status === 418) { 
       // do some stuff here 
      } 
      return response || $q.when(response); 
     }; 
     this.responseError = function (response) { 
      if (response.status === 418) { 
       // do some stuff here 
      } 
      return $q.reject(response); 
     }; 
    }]) 
    .config(['$httpProvider', function ($httpProvider) { 
     // do routing, etc. 

     $httpProvider.interceptors.push('httpResponseInterceptor'); 
    }]); 


在角2中,延伸等Http东西这个代替做

...并通过将其包括在app.module.ts中:

providers: [ 
    { provide: Http, useClass: HttpInterceptor } 
] 

参考见this stackoverflow answerthis gist


不过,我得到这个错误与上面的角2码:

无法实例循环依赖! Http:in NgModule AppModule

回答

4

这个配置适用于我;我使用角2 V2.4.1:

app.module.ts

{ 
    provide: Http, 
    useFactory: (backend: XHRBackend, options: RequestOptions) => { 
     return new HttpInterceptor(backend, options); 
    }, 
    deps: [XHRBackend, RequestOptions] 
} 

HttpInterceptor.ts

import { Injectable } from '@angular/core'; 
import { 
    Http, 
    ConnectionBackend, 
    RequestOptions, 
    RequestOptionsArgs, 
    Request, 
    Response, 
    Headers 
} from '@angular/http'; 

import { Observable } from 'rxjs/Rx'; 

@Injectable() 
export class HttpInterceptor extends Http { 
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.request(url, options)); 
    } 

    ... 
} 
+0

感谢您对本! 'useFactory'和'deps'对我来说工作正常,而不是'useClass'。 –