Angular 2 (Ionic 2):拦截 ajax 请求

使用 Angular 1.x 可以使用以下代码拦截所有 ajax 请求:

With Angular 1.x is possible to intercept all ajax requests with some code like:

$httpProvider.interceptors.push('interceptRequests');
...
var app_services = angular.module('app.services', []);
   app_services.factory('interceptRequests', [function () {
   var authInterceptorServiceFactory = {};
   var _request = function (config) {
   //do something here
   };
   var _responseError = function (rejection) {
   //do something here
   }
   authInterceptorServiceFactory.request = _request;
   authInterceptorServiceFactory.responseError = _responseError;
   return authInterceptorServiceFactory;
}]);

Angular 2 中是否有类似的(或开箱即用的)功能?

Is there anything similar (or out-of-the-box) in Angular 2?

推荐答案

一种方法可以是扩展 HTTP 对象来拦截调用:

An approach could be to extend the HTTP object to intercept calls:

@Injectable()
export class CustomHttp extends Http {

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    console.log('request...');
    return super.request(url, options).catch(res => {
      // do something
    });        
  }

  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    console.log('get...');
    return super.get(url, options).catch(res => {
      // do something
    });
  }
}

并按如下所述进行注册:

and register it as described below:

bootstrap(AppComponent, [HTTP_PROVIDERS,
    new Provider(Http, {
      useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
      deps: [XHRBackend, RequestOptions]
  })
]);

您可以利用例如 catch 运算符来捕获错误并在全局范围内处理它们...

You can leverage for example the catch operator to catch errors and handle them globally...

看到这个 plunkr:https://plnkr.co/edit/ukcJRuZ7QKlV73jiUDd1?p=preview.

See this plunkr: https://plnkr.co/edit/ukcJRuZ7QKlV73jiUDd1?p=preview.

相关文章