En aquest tema, aprendrem com gestionar les respostes HTTP en una aplicació Angular. Quan fem sol·licituds HTTP, és crucial saber com tractar les dades que rebem, així com gestionar possibles errors. A continuació, veurem com fer-ho pas a pas.
Objectius
- Comprendre com rebre i processar respostes HTTP.
- Aprendre a gestionar errors en les respostes HTTP.
- Utilitzar operadors d'RxJS per transformar i manipular les dades rebudes.
- Rebre respostes HTTP
Quan fem una sol·licitud HTTP, rebem una resposta que conté dades. Utilitzarem el servei HttpClient d'Angular per fer sol·licituds i gestionar les respostes.
Exemple bàsic
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-data-fetcher',
template: `<div *ngIf="data">{{ data | json }}</div>`,
})
export class DataFetcherComponent implements OnInit {
data: any;
constructor(private http: HttpClient) {}
ngOnInit() {
this.http.get('https://api.example.com/data')
.subscribe(response => {
this.data = response;
});
}
}Explicació
- Importació del
HttpClient: ImportemHttpClientdes de@angular/common/http. - Injecció de dependències: Injecció del servei
HttpClienten el constructor del component. - Fer una sol·licitud GET: Utilitzem el mètode
getdelHttpClientper fer una sol·licitud GET a una URL. - Subscripció a l'observable: Ens subscrivim a l'observable retornat per
getper rebre la resposta.
- Gestionar errors
És important gestionar els errors que poden ocórrer durant les sol·licituds HTTP. Utilitzarem l'operador catchError d'RxJS per capturar i gestionar errors.
Exemple amb gestió d'errors
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { catchError } from 'rxjs/operators';
import { of } from 'rxjs';
@Component({
selector: 'app-data-fetcher',
template: `
<div *ngIf="data">{{ data | json }}</div>
<div *ngIf="error">{{ error }}</div>
`,
})
export class DataFetcherComponent implements OnInit {
data: any;
error: string;
constructor(private http: HttpClient) {}
ngOnInit() {
this.http.get('https://api.example.com/data')
.pipe(
catchError(err => {
this.error = 'Error fetching data';
return of(null);
})
)
.subscribe(response => {
this.data = response;
});
}
}Explicació
- Importació de
catchErroriof: Importem l'operadorcatchErrori la funcióofd'RxJS. - Utilització de
catchError: UtilitzemcatchErrorper capturar errors i retornar un observable amb un valor per defecte (nullen aquest cas). - Assignació d'un missatge d'error: Assignem un missatge d'error a la propietat
errordel component.
- Transformar dades amb operadors d'RxJS
Podem utilitzar operadors d'RxJS per transformar les dades rebudes abans de processar-les.
Exemple amb transformació de dades
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-data-fetcher',
template: `<div *ngIf="data">{{ data | json }}</div>`,
})
export class DataFetcherComponent implements OnInit {
data: any;
constructor(private http: HttpClient) {}
ngOnInit() {
this.http.get('https://api.example.com/data')
.pipe(
map(response => {
// Transformem les dades aquí
return response['items'];
})
)
.subscribe(transformedData => {
this.data = transformedData;
});
}
}Explicació
- Importació de
map: Importem l'operadormapd'RxJS. - Utilització de
map: Utilitzemmapper transformar les dades rebudes. En aquest exemple, accedim a la propietatitemsde la resposta.
Exercici pràctic
Enunciat
Crea un component que faci una sol·licitud HTTP a una API pública (per exemple, https://jsonplaceholder.typicode.com/posts) i mostri els títols dels posts en una llista. Gestiona els errors mostrant un missatge d'error si la sol·licitud falla.
Solució
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { catchError, map } from 'rxjs/operators';
import { of } from 'rxjs';
@Component({
selector: 'app-post-list',
template: `
<ul *ngIf="posts">
<li *ngFor="let post of posts">{{ post.title }}</li>
</ul>
<div *ngIf="error">{{ error }}</div>
`,
})
export class PostListComponent implements OnInit {
posts: any[];
error: string;
constructor(private http: HttpClient) {}
ngOnInit() {
this.http.get('https://jsonplaceholder.typicode.com/posts')
.pipe(
map(response => response as any[]),
catchError(err => {
this.error = 'Error fetching posts';
return of([]);
})
)
.subscribe(posts => {
this.posts = posts;
});
}
}Explicació
- Sol·licitud GET: Fem una sol·licitud GET a l'API pública.
- Transformació de dades: Utilitzem
mapper convertir la resposta en un array. - Gestió d'errors: Utilitzem
catchErrorper gestionar errors i retornar un array buit en cas d'error. - Visualització de dades: Mostrem els títols dels posts en una llista no ordenada (
<ul>).
Resum
En aquest tema, hem après com gestionar respostes HTTP en Angular. Hem vist com rebre i processar dades, gestionar errors i transformar dades utilitzant operadors d'RxJS. Aquests conceptes són fonamentals per treballar amb APIs i serveis web en aplicacions Angular.
Curs d'Angular
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- Arquitectura d'Angular
- Primera aplicació Angular
Mòdul 2: Components d'Angular
- Comprendre els components
- Crear components
- Plantilles de components
- Estils de components
- Interacció de components
Mòdul 3: Enllaç de dades i directives
- Interpolació i enllaç de propietats
- Enllaç d'esdeveniments
- Enllaç de dades bidireccional
- Directives integrades
- Directives personalitzades
Mòdul 4: Serveis i injecció de dependències
Mòdul 5: Enrutament i navegació
Mòdul 6: Formularis a Angular
Mòdul 7: Client HTTP i observables
- Introducció al client HTTP
- Fer sol·licituds HTTP
- Gestionar respostes HTTP
- Utilitzar observables
- Gestió d'errors
Mòdul 8: Gestió d'estat
- Introducció a la gestió d'estat
- Utilitzar serveis per a la gestió d'estat
- NgRx Store
- NgRx Effects
- NgRx Entity
Mòdul 9: Proves a Angular
- Proves unitàries
- Proves de components
- Proves de serveis
- Proves de cap a cap
- Simulació de dependències
Mòdul 10: Conceptes avançats d'Angular
- Angular Universal
- Optimització del rendiment
- Internacionalització (i18n)
- Tubs personalitzats
- Animacions d'Angular
