I want to inform the user if an HTTP request fails, without having to write additional code for every HTTP request.
I had a working prototype for angular 2:
<
I'm centralizing this kind of logic inside a BaseService
, and then inherit every service from It. Angular 2 doesn't provide Http Interceptors
as the previous version, making this kind of stuff difficult to handle.
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { NotificationService } from '********';
@Injectable()
export class BaseService {
protected url: string;
protected http: Http;
constructor(http: Http, protected notification: NotificationService) {
this.http = http;
}
protected extractData(res: Response) {
//
// Depende do formato da response, algumas APIs retornam um objeto data e dentro deste o conteudo propriamente dito
// Em minhas APIs sempre retorno diretamente o objeto que desejo
//
return res.json();
}
protected handleError(error: Response | any) {
let erros: string[] = [];
switch (error.status) {
case 400:
let res = error.json();
//
// Depende do formato, minhas APIs sempre retornar um objeto com array errors quando tenho 400
//
for (let index = 0; index < res.errors.length; index++) {
let msg = res.errors[index];
erros.push(msg);
};
this.notification.showMultipleWarn(erros);
break;
case 404:
this.notification.showWarning('O recurso requisitado não existe.');
break;
case 406:
case 409:
case 500:
this.notification.showError('Ocorreu um erro inesperado.');
break;
default:
this.notification.showError('Ocorreu um erro inesperado.');
break;
}
return Observable.throw(new Error(error.status));
}
}
Here's my blog post explaining some way to handle this less verbosely: Receitas Angular2: Interceptando erros HTTP de forma Global
The post is written in portuguese, but the code could give you some hints. I'm using this approach in some huge projects right now, and It's working fine.