Что такое httpinterceptor эквивалент в angular2?
в angularjs, у нас есть HTTP-перехватчик
$httpProvider.interceptors.push('myHttpInterceptor');
С помощью которого мы можем подключаться ко всем http-вызовам, а также показывать или скрывать панели загрузки, вести журнал и т. д..
что такое эквивалент в angular2?
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.0feat (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.
попробовать Ковалентный из 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