2016-09-10 15 views
1

APIコールを行うAngular 2アプリを実装しています。とにかくジェネリックエラーハンドラを作ることができるかどうか疑問に思っていました。たとえば、APIが401コードで応答すると、ユーザーをログインルートにリダイレクトしたいとします。これは可能ですか?角度2のHttpレスポンスジェネリックエラーハンドラ

おかげ

答えて

7

は、私はすべての私のサービスからのHTTPを使用するヘルパーメソッドを作成しました。これは少なくとも、アプリケーションを通じてすべてのhttpアクティビティを集中管理します。 Angular 2 http service. Get detailed error information

UPD:: - remove方法を修正2016年9月12日ここに私の質問を参照してください - エラーの詳細を取り扱い

はかかわらず、時々あります。角度のあるHTTPサービスでは、本文を定義する必要があります。このメソッドが存在する理由 - 私はdelete要求の一部として身体を渡すことができるようにしたいと考えていましたが、Angularの方法では許可されていません。

import {Injectable} from '@angular/core'; 
import {Http, Request, Response, Headers, RequestOptionsArgs, RequestMethod} from "@angular/http"; 
import {RequestArgs} from "@angular/http/src/interfaces"; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class JsonHttpHelper { 
    protected headers: Headers; 

    constructor(private _http: Http) { 
     this.headers = new Headers(); 
     this.headers.append('Content-Type', 'application/json'); 
     this.headers.append('Accept', 'application/json'); 
    } 

    get(url:string) : Observable<any> { 
     return this._http.get(url) 
      .map((res: Response) => res.json()) 
      .catch(this.handleError); 
    } 

    post(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> { 
     if (args == null) args = {}; 
     if (args.headers === undefined) args.headers = this.headers; 

     return this._http.post(url, JSON.stringify(data), args) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    put(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> { 
     if (args == null) args = {}; 
     if (args.headers === undefined) args.headers = this.headers; 

     return this._http.put(url, JSON.stringify(data), args) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    remove(url: string, data?: any, args?: RequestOptionsArgs): Observable<any> { 
     if (args == null) args = {}; 

     args.url = url; 
     args.method = RequestMethod.Delete; 
     if (!args.headers) args.headers = this.headers; 
     args.body = data ? JSON.stringify(data) : null; 

     return this._http.request(new Request(<RequestArgs>args)) 
      .map((res: Response) => JsonHttpHelper.json(res)) 
      .catch(this.handleError); 
    } 

    private static json(res: Response): any { 
     return res.text() === "" ? res : res.json(); 
    } 

    private handleError(error:any) { 
     console.error(error); 
     return Observable.throw(error); 

     // The following doesn't work. 
     // There's no error status at least in case of network errors. 
     // WHY?! 
     // 
     // if (error === undefined) error = null; 
     // let errMsg = (error && error.message) 
     //  ? error.message 
     //  : (error && error.status) 
     //   ? `${error.status} - ${error.statusText}` 
     //   : error; 
     // 
     // return Observable.throw(errMsg); 
    } 
} 
+0

たとえば、コンポーネントが独自の 'catch'関数を実装する' JsonHttpHelper'を呼び出すとどうなりますか?どちらが呼ばれますか?それとも最初に呼ばれるでしょうか? –

+0

Helperが最初になりますが、エラーが発生した場合はコンポーネントを再起動します。 – rook

+1

私はそれが起こっていないと思う。私はこのようなやりとりをして、ヘルパーの「キャッチ」が呼ばれたときに実装しました。手動でヘルパーでエラーをretrhowするか、(私の場合は)より良いものを投げない限り、呼び出し元の 'then'だけが呼び出されます。しかし、この答えは私の問題を解決します。ありがとう –