Я работаю над приложением Angular 2 и нуждаюсь в некоторых рекомендациях по устранению ошибок аутентификации.
Моя конечная цель - централизованно обрабатывать ошибки аутентификации (в частности, 401 и 403) для каждого запроса Http
.
Я нашел этот вопрос, очень полезный для того, чтобы начать меня, однако я застрял в том, чтобы правильно зарегистрировать обработчик ошибок для каждого наблюдаемого, возвращенного моим обычным Http
.
Вот пример того, с чем я сейчас работаю:
import {Injectable} from 'angular2/core';
import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
@Injectable()
export class ClauthHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
var response = super.get(url, options);
return this._handleSecurityResponse(response);
}
/*
Other overrides omitted for brevity...
*/
private _handleSecurityResponse(response: Observable<Response>): Observable<Response> {
response.subscribe(null, (error: Response) => {
// Do some nifty error handling here.
});
return response;
}
}
Вышеупомянутое решение "работает" с одной зацепкой... Каждый HTTP-запрос выполняется дважды. Это нехорошо.
Любые указания относительно того, как правильно это сделать?
(Обновить) Рабочий код
Основываясь на информации в принятом ответе, вот что выглядит класс в его правильно функционирующей форме.
import {Injectable} from 'angular2/core';
import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/share';
@Injectable()
export class ClauthHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
var response = super.get(url, options);
return this._handleSecurityResponse(response);
}
/*
Other overrides omitted for brevity...
*/
private _handleSecurityResponse(response: Observable<Response>): Observable<Response> {
var sharable = response.share();
sharable.subscribe(null, (error: Response) => {
// Do some nifty error handling here.
});
return sharable;
}
}