En aquest tema, aprendrem com gestionar les respostes HTTP en una aplicació Angular. Quan fem sol·licituds HTTP, és crucial saber com tractar les respostes, ja que poden contenir dades importants o errors que necessitem manejar adequadament.
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 de les respostes.
Continguts
- Recepció de respostes HTTP
- Gestió d'errors HTTP
- Transformació de dades amb operadors d'RxJS
- Exemples pràctics
- Exercicis
- Recepció de respostes HTTP
Quan fem una sol·licitud HTTP amb el HttpClient d'Angular, rebem una resposta que podem processar. Aquí teniu un exemple bàsic de com fer una sol·licitud GET i gestionar la resposta:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) {}
getData() {
return this.http.get(this.apiUrl);
}
}En aquest exemple, getData retorna un observable que emet la resposta de la sol·licitud GET. Per processar aquesta resposta, podem subscriure'ns a l'observable:
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-data',
template: `<div *ngIf="data">{{ data | json }}</div>`
})
export class DataComponent implements OnInit {
data: any;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getData().subscribe(
response => {
this.data = response;
},
error => {
console.error('Error:', error);
}
);
}
}
- Gestió d'errors HTTP
És important gestionar els errors que poden ocórrer durant les sol·licituds HTTP. Podem fer-ho utilitzant el segon paràmetre de la funció subscribe:
this.dataService.getData().subscribe(
response => {
this.data = response;
},
error => {
console.error('Error:', error);
// Aquí podem mostrar un missatge d'error a l'usuari
}
);També podem utilitzar l'operador catchError d'RxJS per gestionar errors de manera més elegant:
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
getData() {
return this.http.get(this.apiUrl).pipe(
catchError(error => {
console.error('Error:', error);
return throwError(error);
})
);
}
- Transformació de dades amb operadors d'RxJS
Podem utilitzar operadors d'RxJS per transformar les dades de la resposta abans de retornar-les. Per exemple, podem utilitzar l'operador map per extreure una part específica de la resposta:
import { map } from 'rxjs/operators';
getData() {
return this.http.get(this.apiUrl).pipe(
map(response => response['data']) // Suposant que la resposta té una propietat 'data'
);
}
- Exemples pràctics
Exemple 1: Sol·licitud GET amb gestió d'errors
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) {}
getData() {
return this.http.get(this.apiUrl).pipe(
catchError(error => {
console.error('Error:', error);
return throwError(error);
})
);
}
}Exemple 2: Transformació de dades amb map
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) {}
getData() {
return this.http.get(this.apiUrl).pipe(
map(response => response['data']),
catchError(error => {
console.error('Error:', error);
return throwError(error);
})
);
}
}
- Exercicis
Exercici 1: Sol·licitud GET amb gestió d'errors
Crea un servei que faci una sol·licitud GET a una API pública i gestioni els errors. Mostra les dades en un component i gestiona els errors mostrant un missatge a l'usuari.
Exercici 2: Transformació de dades
Modifica el servei de l'exercici anterior per transformar les dades de la resposta abans de retornar-les. Per exemple, extreu una propietat específica de la resposta.
Solucions
Solució Exercici 1
// data.service.ts
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.publicapis.org/entries';
constructor(private http: HttpClient) {}
getData() {
return this.http.get(this.apiUrl).pipe(
catchError(error => {
console.error('Error:', error);
return throwError(error);
})
);
}
}
// data.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-data',
template: `
<div *ngIf="data">{{ data | json }}</div>
<div *ngIf="error">{{ error }}</div>
`
})
export class DataComponent implements OnInit {
data: any;
error: string;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getData().subscribe(
response => {
this.data = response;
},
error => {
this.error = 'Error al carregar les dades';
}
);
}
}Solució Exercici 2
// data.service.ts
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.publicapis.org/entries';
constructor(private http: HttpClient) {}
getData() {
return this.http.get(this.apiUrl).pipe(
map(response => response['entries']),
catchError(error => {
console.error('Error:', error);
return throwError(error);
})
);
}
}
// data.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-data',
template: `
<div *ngIf="data">{{ data | json }}</div>
<div *ngIf="error">{{ error }}</div>
`
})
export class DataComponent implements OnInit {
data: any;
error: string;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getData().subscribe(
response => {
this.data = response;
},
error => {
this.error = 'Error al carregar les dades';
}
);
}
}Conclusió
En aquesta secció, hem après com gestionar les respostes HTTP en Angular, incloent la recepció de dades, la gestió d'errors i la transformació de dades utilitzant operadors d'RxJS. Aquests conceptes són fonamentals per treballar amb APIs i serveis web en aplicacions Angular. En el proper tema, explorarem com utilitzar observables per gestionar fluxos de dades de manera reactiva.
Curs d'Angular 2+
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- La teva primera aplicació Angular
- Arquitectura d'Angular
Mòdul 2: Conceptes bàsics de TypeScript
- Introducció a TypeScript
- Variables i tipus de dades en TypeScript
- Funcions i funcions fletxa
- Classes i interfícies
Mòdul 3: Components i plantilles
Mòdul 4: Directives i pipes
Mòdul 5: Serveis i injecció de dependències
Mòdul 6: Enrutament i navegació
Mòdul 7: Formularis en Angular
Mòdul 8: Client HTTP i observables
- Introducció al client HTTP
- Realització de sol·licituds HTTP
- Gestió de respostes HTTP
- Ús d'observables
