En aquest tema, aprendrem com fer sol·licituds HTTP en una aplicació Angular utilitzant el HttpClient d'Angular. Aquest mòdul és essencial per a la comunicació amb servidors i l'obtenció de dades externes.
Objectius
- Comprendre com configurar el
HttpClientModule. - Aprendre a fer sol·licituds GET i POST.
- Gestionar les respostes HTTP.
- Tractar errors en les sol·licituds HTTP.
Configuració del HttpClientModule
Abans de poder utilitzar el HttpClient, hem d'importar el HttpClientModule en el nostre mòdul principal (AppModule).
// app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule // Afegim el HttpClientModule aquí
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }Fer una sol·licitud GET
Una sol·licitud GET s'utilitza per obtenir dades d'un servidor. A continuació, es mostra com fer una sol·licitud GET utilitzant el HttpClient.
Exemple de codi
// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) { }
getData(): Observable<any> {
return this.http.get<any>(this.apiUrl);
}
}Explicació
- Importacions: Importem
HttpClientiObservablede@angular/common/httpirxjsrespectivament. - Injectable: Marquem la classe
DataServicecom a injectable. - Constructor: Injectem
HttpClienten el constructor. - getData(): Definim un mètode
getDataque retorna unObservablede la sol·licitud GET.
Utilització del servei en un component
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-root',
template: `
<div *ngIf="data">
<pre>{{ data | json }}</pre>
</div>
`
})
export class AppComponent implements OnInit {
data: any;
constructor(private dataService: DataService) { }
ngOnInit() {
this.dataService.getData().subscribe(
(response) => this.data = response,
(error) => console.error('Error: ', error)
);
}
}Explicació
- Importacions: Importem
DataServiceiOnInit. - Constructor: Injectem
DataServiceen el constructor. - ngOnInit(): En el mètode
ngOnInit, fem la sol·licitud GET i assignem la resposta a la propietatdata.
Fer una sol·licitud POST
Una sol·licitud POST s'utilitza per enviar dades a un servidor. A continuació, es mostra com fer una sol·licitud POST utilitzant el HttpClient.
Exemple de codi
// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) { }
postData(data: any): Observable<any> {
return this.http.post<any>(this.apiUrl, data);
}
}Explicació
- postData(): Definim un mètode
postDataque accepta un objectedatai retorna unObservablede la sol·licitud POST.
Utilització del servei en un component
// app.component.ts
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-root',
template: `
<button (click)="sendData()">Send Data</button>
`
})
export class AppComponent {
constructor(private dataService: DataService) { }
sendData() {
const data = { name: 'John', age: 30 };
this.dataService.postData(data).subscribe(
(response) => console.log('Response: ', response),
(error) => console.error('Error: ', error)
);
}
}Explicació
- sendData(): Definim un mètode
sendDataque crea un objectedatai fa la sol·licitud POST utilitzant el serveiDataService.
Gestió d'errors
És important gestionar els errors en les sol·licituds HTTP per proporcionar una millor experiència d'usuari.
Exemple de codi
// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://api.example.com/data';
constructor(private http: HttpClient) { }
getData(): Observable<any> {
return this.http.get<any>(this.apiUrl).pipe(
catchError(this.handleError)
);
}
private handleError(error: HttpErrorResponse) {
let errorMessage = 'Unknown error!';
if (error.error instanceof ErrorEvent) {
// Error del client
errorMessage = `Error: ${error.error.message}`;
} else {
// Error del servidor
errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
}
return throwError(errorMessage);
}
}Explicació
- catchError: Utilitzem l'operador
catchErrorper capturar errors. - handleError(): Definim un mètode
handleErrorper gestionar els errors i retornar un missatge d'error adequat.
Exercicis pràctics
Exercici 1: Fer una sol·licitud GET
- Crea un nou servei
UserService. - Defineix un mètode
getUsersque faci una sol·licitud GET ahttps://jsonplaceholder.typicode.com/users. - Mostra la llista d'usuaris en un component.
Solució
// user.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private apiUrl = 'https://jsonplaceholder.typicode.com/users';
constructor(private http: HttpClient) { }
getUsers(): Observable<any> {
return this.http.get<any>(this.apiUrl);
}
}
// user.component.ts
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-user',
template: `
<ul>
<li *ngFor="let user of users">{{ user.name }}</li>
</ul>
`
})
export class UserComponent implements OnInit {
users: any;
constructor(private userService: UserService) { }
ngOnInit() {
this.userService.getUsers().subscribe(
(response) => this.users = response,
(error) => console.error('Error: ', error)
);
}
}Exercici 2: Fer una sol·licitud POST
- Afegeix un mètode
addUseralUserServiceque faci una sol·licitud POST ahttps://jsonplaceholder.typicode.com/users. - Crea un formulari en un component per afegir un nou usuari.
Solució
// user.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserService {
private apiUrl = 'https://jsonplaceholder.typicode.com/users';
constructor(private http: HttpClient) { }
getUsers(): Observable<any> {
return this.http.get<any>(this.apiUrl);
}
addUser(user: any): Observable<any> {
return this.http.post<any>(this.apiUrl, user);
}
}
// user.component.ts
import { Component } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-user',
template: `
<form (ngSubmit)="onSubmit()">
<input [(ngModel)]="user.name" name="name" placeholder="Name" required>
<button type="submit">Add User</button>
</form>
<ul>
<li *ngFor="let user of users">{{ user.name }}</li>
</ul>
`
})
export class UserComponent {
users: any;
user = { name: '' };
constructor(private userService: UserService) { }
ngOnInit() {
this.userService.getUsers().subscribe(
(response) => this.users = response,
(error) => console.error('Error: ', error)
);
}
onSubmit() {
this.userService.addUser(this.user).subscribe(
(response) => {
this.users.push(response);
this.user.name = '';
},
(error) => console.error('Error: ', error)
);
}
}Conclusió
En aquest tema, hem après com fer sol·licituds HTTP GET i POST utilitzant el HttpClient d'Angular. També hem vist com gestionar les respostes i errors en les sol·licituds HTTP. Aquestes habilitats són fonamentals per a la comunicació amb servidors i l'obtenció de dades externes 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
