私はAngular 2アプリに取り組んでおり、認証エラーをきれいに処理する方法についていくつかのガイダンスが必要です.
Http
私の最終目標は、すべてのリクエストの認証エラー (具体的には 401 と 403) を一元的に処理できるようにすることです。
この質問は、開始するのに非常に役立ちましたが、カスタム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;
}
}
上記のソリューションは、1 回のヒッチで「機能」します... すべての HTTP リクエストは 2 回行われます。それは良くないね。
これを適切に行う方法に関するガイダンスはありますか?
(更新) 作業コード
ここで受け入れられた回答の情報に基づいて、適切に機能する形式でクラスがどのように見えるかを示します。
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;
}
}