Что такое httpinterceptor эквивалент в angular2?



в angularjs, у нас есть HTTP-перехватчик



$httpProvider.interceptors.push('myHttpInterceptor');


С помощью которого мы можем подключаться ко всем http-вызовам, а также показывать или скрывать панели загрузки, вести журнал и т. д..



что такое эквивалент в angular2?

643   10  

10 ответов:

как указал @Günter, нет никакого способа зарегистрировать перехватчики. Вам нужно расширить Http класс и поместите обработку перехвата вокруг HTTP-вызовов

сначала вы можете создать класс, который расширяет Http:

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

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

и зарегистрируйте его, как описано ниже:

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

The request и requestError виды могут быть добавлены перед вызовом целевого метода.

на response один, вам нужно подключить некоторые асинхронная обработка в существующую технологическую цепочку. Это зависит от ваших потребностей, но вы можете использовать операторы (например,flatMap) наблюдаемых.

наконец responseError нужно позвонить catch оператор на целевой звонок. Таким образом, вы будете уведомлены о возникновении ошибки в ответе.

эта ссылка может помочь вам:

обновление

новая HttpClient модуль, введенный в Angular 4.3.0, поддерживает перехватчики https://github.com/angular/angular/compare/4.3.0-rc.0...4.3.0

feat (common): новый HttpClient API HttpClient-это эволюция существующий угловой HTTP API, который существует рядом с ним в отдельном пакет, @angular / common / http. Эта структура обеспечивает что существующий программы могут медленно мигрировать на новую ПРИКЛАДНОЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС.

новый API значительно улучшает эргономику и характеристики устаревший API. Частичный список новых функций включает в себя:

  • типизированный, синхронный доступ к телу ответа, включая поддержку типов тел JSON
  • JSON является предполагаемым значением по умолчанию и больше не нуждается в явном анализе
  • перехватчики позволяют вставлять логику промежуточного программного обеспечения в конвейер
  • неизменяемый запрос/ответ объекты
  • события прогресса как для загрузки запроса, так и для загрузки ответа
  • POST-запрос по проверке базы на основе и заподлицо тестирования

оригинал

Angular2 не имеет (пока) перехватчиков. Вместо этого вы можете расширить Http,XHRBackend,BaseRequestOptions или любой из других задействованных классов (по крайней мере, в TypeScript и Dart (не знаю о простом JS).

Смотрите также

в этом репозитории есть реализация для службы Http @angular/core-like:https://github.com/voliva/angular2-interceptors

вы просто объявляете поставщика для этой службы на bootstrap, добавляя любые перехватчики, которые вам нужны, и он будет доступен для всех компонентов.

import { provideInterceptorService } from 'ng2-interceptors';

@NgModule({
  declarations: [
    ...
  ],
  imports: [
    ...,
    HttpModule
  ],
  providers: [
    MyHttpInterceptor,
    provideInterceptorService([
      MyHttpInterceptor,
      /* Add other interceptors here, like "new ServerURLInterceptor()" or
         just "ServerURLInterceptor" if it has a provider */
    ])
  ],
  bootstrap: [AppComponent]
})

DEPRICATED с углового 4.3 (HttpInterCeptors вернулись в 4.3)

вы можете создать свой собственный класс HTTP и использовать RxJS Subject Service для повторного использования вашего пользовательского класса Http и реализовать свое поведение в пользовательском классе.

реализация вашего пользовательского Http-класса с "HttpSubjectService", который содержит некоторые субъекты rxjs.

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


import { HttpSubjectService } from './httpSubject.service';


@Injectable()
export class CustomHttp extends Http {
   constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private httpSubjectService: HttpSubjectService) {
       super(backend, defaultOptions);

       //Prevent Ajax Request Caching for Internet Explorer
       defaultOptions.headers.append("Cache-control", "no-cache");
       defaultOptions.headers.append("Cache-control", "no-store");
       defaultOptions.headers.append("Pragma", "no-cache");
       defaultOptions.headers.append("Expires", "0");
   }

   request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
       //request Start;
       this.httpSubjectService.addSpinner();
       return super.request(url, options).map(res => {
           //Successful Response;
           this.httpSubjectService.addNotification(res.json());
           return res;
       })
           .catch((err) => {
               //Error Response.
               this.httpSubjectService.removeSpinner();
               this.httpSubjectService.removeOverlay();

               if (err.status === 400 || err.status === 422) {
                   this.httpSubjectService.addHttp403(err);
                   return Observable.throw(err);
               } else if (err.status === 500) {
                   this.httpSubjectService.addHttp500(err);
                   return Observable.throw(err);
               } else {
                   return Observable.empty();
               }
           })
           .finally(() => {
               //After the request;
               this.httpSubjectService.removeSpinner();
           });
   }
}

пользовательский модуль для регистрации класса CustomHttp - здесь вы перезаписываете Http по умолчанию реализация из углового с вашей собственной реализацией CustomHttp.

import { NgModule, ValueProvider } from '@angular/core';
import { HttpModule, Http, XHRBackend, RequestOptions } from '@angular/http';

//Custom Http
import { HttpSubjectService } from './httpSubject.service';
import { CustomHttp } from './customHttp';

@NgModule({
    imports: [ ],
    providers: [
        HttpSubjectService,
        {
           provide: Http, useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, httpSubjectService: HttpSubjectService) => {
                return new CustomHttp(backend, defaultOptions, httpSubjectService);
            },
            deps: [XHRBackend, RequestOptions, HttpSubjectService]
        }
    ]
})
export class CustomHttpCoreModule {

    constructor() { }
}

теперь нам нужна реализация HttpSubjectService, где мы можем подписаться на наши субъекты rxjs, когда они вызываются с помощью оператора "next".

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class HttpSubjectService {
    //https://github.com/ReactiveX/rxjs/blob/master/doc/subject.md
    //In our app.component.ts class we will subscribe to this Subjects
    public notificationSubject = new Subject();
    public http403Subject = new Subject();
    public http500Subject = new Subject();
    public overlaySubject = new Subject();
    public spinnerSubject = new Subject();

    constructor() { }

    //some Example methods we call in our CustomHttp Class
    public addNotification(resultJson: any): void {
        this.notificationSubject.next(resultJson);
    }

    public addHttp403(result: any): void {
        this.http403Subject.next(result);
    }

    public addHttp500(result: any): void {
        this.http500Subject.next(result);
    }

    public removeOverlay(): void {
        this.overlaySubject.next(0);
    }

    public addSpinner(): void {
        this.spinnerSubject.next(1);
    }

    public removeSpinner(): void {
        this.spinnerSubject.next(-1);
    }
}

чтобы вызвать ваши пользовательские реализации, нам нужно подписаться на темы, например, " приложение.деталь.ts".

import { Component } from '@angular/core';
import { HttpSubjectService } from "../HttpInterception/httpSubject.service";
import { Homeservice } from "../HttpServices/home.service";

@Component({
    selector: 'app',
    templateUrl: './app.component.html',
})
export class AppComponent {
    private locals: AppLocalsModel = new AppLocalsModel();

    constructor(private httpSubjectService : HttpSubjectService, private homeService : Homeservice) {}

    ngOnInit(): void {
        this.notifications();
        this.httpRedirects();
        this.spinner();
        this.overlay();
    }

    public loadServiceData(): void {
        this.homeService.getCurrentUsername()
            .subscribe(result => {
                this.locals.username = result;
            });
    }

    private overlay(): void {
        this.httpSubjectService.overlaySubject.subscribe({
            next: () => {
              console.log("Call Overlay Service");
            }
        });
    }

    private spinner(): void {
        this.httpSubjectService.spinnerSubject.subscribe({
            next: (value: number) => {
              console.log("Call Spinner Service");
            }
        });
    }

    private notifications(): void {
        this.httpSubjectService.notificationSubject.subscribe({
            next: (json: any) => {
                console.log("Call Notification Service");
            }
        });
    }

    private httpRedirects(): void {
        this.httpSubjectService.http500Subject.subscribe({
            next: (error: any) => {
                console.log("Navigate to Error Page");
            }
        });

        this.httpSubjectService.http403Subject.subscribe({
            next: (error: any) => {
                console.log("Navigate to Not Authorized Page");
            }
        });
    }
}


class AppLocalsModel {
    public username : string = "noch nicht abgefragt";
}

начиная с угловой 4.3 вы можете использовать перехватчики

в угловой 4.3 у вас есть родные перехватчики, где вы можете реализовать свой собственный материал, как перенаправление для ошибки сервера 500

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class SxpHttp500Interceptor implements HttpInterceptor {

  constructor(public router: Router) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      return next.handle(req).do(evt => { }).catch(err => {
          if (err["status"]) {
              if (err.status === 500) {
                  this.router.navigate(['/serverError', { fehler: JSON.stringify(err) }]);
              }
          }
          return Observable.throw(err);
      });
  }
}

вам нужно зарегистрировать это в своем основном модуле в массиве провайдеров

import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { Router } from '@angular/router';
import { SxpHttp500Interceptor } from "./sxpHttp500.interceptor";
 ....

providers: [
    {
        provide: HTTP_INTERCEPTORS, useFactory: (router: Router) => { return new SxpHttp500Interceptor(router) },
        multi: true,
        deps: [Router]
    }
]

С выпуском Angular 4.3.1 теперь есть интерфейс под названием HttpInterceptor.

вот ссылка на документы: https://angular.io/api/common/http/HttpInterceptor

вот пример реализации.


это будет реализация класса перехватчика.

в основном пишется как любой другой сервис:

@Injectable()
export class ExceptionsInterceptor implements HttpInterceptor {
    constructor(
        private logger: Logger,
        private exceptionsService: ExceptionsService,
        private notificationsService: NotificationsService
    ) { }
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(request)
            .do((event) => {
                // Do nothing here, manage only errors
            }, (err: HttpErrorResponse) => {
                if (!this.exceptionsService.excludeCodes.includes(err.status)) {
                    if (!(err.status === 400 && err.error['_validations'])) {
                        this.logger.error(err);
                        if (!this.notificationsService.hasNotificationData(err.status)) {
                            this.notificationsService.addNotification({ text: err.message, type: MessageColorType.error, data: err.status, uid: UniqueIdUtility.generateId() });
                        }
                    }
                }
            });
    }
}

тогда, поскольку вы будете относиться к этому как к нормальному сервису, вы необходимо добавить эту строку внутри поставщиков модуля вашего приложения:

{ provide: HTTP_INTERCEPTORS, useClass: ExceptionsInterceptor, multi: true }

надеюсь, что это может помочь.

Угловое 4.3 теперь поддерживает HTTP-перехватчик из-из-коробки. Проверьте, как их использовать: https://ryanchenkie.com/angular-authentication-using-the-http-client-and-http-interceptors

Я выпустил перехватчик со следующим узловым модулем. Мы создали этот модуль для нашей внутренней цели, наконец, мы выпустили в диспетчере пакетов npm npm install angular2-resource-and-ajax-interceptor https://www.npmjs.com/package/angular2-resource-and-ajax-interceptor

Как отметил @squadwuschel, ведется работа по внедрению этой функции в @angular/http. Это будет в виде нового API HttpClient.

см.https://github.com/angular/angular/pull/17143 для получения более подробной информации и текущего состояния.

Angular2 donot поддерживает httpinterceptor как angular1

вот удивительный пример использования httpinterceptor в angular2.

https://github.com/NgSculptor/ng2HttpInterceptor

попробовать Ковалентный из Teradata, Они обеспечивают серии расширений для углового и углового материала.

Регистрация HTTP часть, он предоставляет отсутствующий http-перехватчик в Angular и RESTService(аналогично restangular).

я реализовал проверку подлинности токенов JWT через Ковалентный HTTP в моем примере, пожалуйста, проверьте здесь.

https://github.com/hantsy/angular2-material-sample/blob/master/src/app/core/auth-http-interceptor.ts

прочитайте мои заметки по развитию для него,обрабатывать маркер на основе аутентификации через IHttpInterceptor.

Comments

    Ничего не найдено.