【问题标题】:Angular 2 HTTP response interceptorAngular 2 HTTP 响应拦截器
【发布时间】:2017-02-14 04:10:51
【问题描述】:

在 Angular 1 中,全局处理 HTTP 响应状态是通过 $httpProvider 完成的:

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');
    }]);


在 Angular 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());
  }
}

...并将其包含在 app.module.ts:

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

请参阅 this stackoverflow answerthis gist 以供参考。


但是,我在上面的 Angular 2 代码中遇到了这个错误:

无法实例化循环依赖! Http:在 NgModule AppModule 中

【问题讨论】:

    标签: http angular


    【解决方案1】:

    这个配置对我有用;我正在使用 Angular 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));
        }
    
       ...
    }
    

    【讨论】:

    • 谢谢你! useFactorydeps 对我来说正常工作,而不是 useClass
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2023-03-13
    • 2016-08-14
    • 2017-11-07
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多