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
HttpClient
iObservable
de@angular/common/http
irxjs
respectivament. - Injectable: Marquem la classe
DataService
com a injectable. - Constructor: Injectem
HttpClient
en el constructor. - getData(): Definim un mètode
getData
que retorna unObservable
de 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
DataService
iOnInit
. - Constructor: Injectem
DataService
en 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
postData
que accepta un objectedata
i retorna unObservable
de 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
sendData
que crea un objectedata
i 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
catchError
per capturar errors. - handleError(): Definim un mètode
handleError
per 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
getUsers
que 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
addUser
alUserService
que 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