首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角2 HTTP响应拦截器

角2 HTTP响应拦截器
EN

Stack Overflow用户
提问于 2017-02-14 04:10:51
回答 1查看 4.7K关注 0票数 2

在角1中,全局处理HTTP响应状态是用$httpProvider完成的

代码语言:javascript
复制
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的:

代码语言:javascript
复制
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());
  }
}

...and通过将其包括在app.module.ts

代码语言:javascript
复制
providers: [
    { provide: Http, useClass: HttpInterceptor }
]

有关参考,请参见https://stackoverflow.com/q/34934009/1298685https://gist.github.com/mrgoos/45ab013c2c044691b82d250a7df71e4c

但是,使用上面的角2代码我得到了这个错误:

不能实例化循环依赖关系!Http: in NgModule AppModule

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-14 04:21:01

这种配置适用于我;我使用的是角2v2.4.1:

app.module.ts

代码语言:javascript
复制
{
    provide: Http,
    useFactory: (backend: XHRBackend, options: RequestOptions) => {
        return new HttpInterceptor(backend, options);
    },
    deps: [XHRBackend, RequestOptions]
}

HttpInterceptor.ts

代码语言:javascript
复制
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));
    }

   ...
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42217714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档