En esta sección, aprenderemos cómo realizar solicitudes HTTP en Angular utilizando el módulo HttpClient. Este módulo nos permite comunicarnos con servidores remotos a través de HTTP, lo que es esencial para interactuar con APIs y servicios web.
Contenido
Configuración del HttpClientModule
Antes de poder realizar solicitudes HTTP, necesitamos importar y configurar el HttpClientModule en nuestra aplicación Angular.
- Abre el archivo
app.module.ts. - Importa
HttpClientModuledesde@angular/common/http. - Añade
HttpClientModulea la lista deimportsen el decorador@NgModule.
// 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
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }Realizando una Solicitud GET
Las solicitudes GET se utilizan para recuperar datos de un servidor. Vamos a crear un servicio que realice una solicitud GET a una API pública.
-
Crea un nuevo servicio utilizando Angular CLI:
ng generate service data -
En el archivo
data.service.ts, importaHttpClientyObservabledesde@angular/common/httpyrxjsrespectivamente. -
Inyecta
HttpClienten el constructor del servicio y crea un método para realizar la solicitud GET.
// 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://jsonplaceholder.typicode.com/posts';
constructor(private http: HttpClient) { }
getPosts(): Observable<any> {
return this.http.get<any>(this.apiUrl);
}
}- En un componente, inyecta el servicio
DataServicey utiliza el métodogetPostspara obtener los datos.
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-root',
template: `
<div *ngIf="posts">
<h1>Posts</h1>
<ul>
<li *ngFor="let post of posts">{{ post.title }}</li>
</ul>
</div>
`
})
export class AppComponent implements OnInit {
posts: any;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getPosts().subscribe(data => {
this.posts = data;
});
}
}Realizando una Solicitud POST
Las solicitudes POST se utilizan para enviar datos al servidor. Vamos a añadir un método en nuestro servicio para realizar una solicitud POST.
- En el archivo
data.service.ts, añade un nuevo métodoaddPost.
// data.service.ts
addPost(post: any): Observable<any> {
return this.http.post<any>(this.apiUrl, post);
}- En el componente, crea un método para enviar datos utilizando el servicio.
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-root',
template: `
<div *ngIf="posts">
<h1>Posts</h1>
<ul>
<li *ngFor="let post of posts">{{ post.title }}</li>
</ul>
</div>
<button (click)="addPost()">Add Post</button>
`
})
export class AppComponent implements OnInit {
posts: any;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getPosts().subscribe(data => {
this.posts = data;
});
}
addPost() {
const newPost = { title: 'New Post', body: 'This is a new post.' };
this.dataService.addPost(newPost).subscribe(post => {
this.posts.push(post);
});
}
}Otras Solicitudes HTTP
Además de GET y POST, también podemos realizar solicitudes PUT, DELETE, PATCH, etc. Aquí hay ejemplos de cómo se pueden implementar:
// data.service.ts
updatePost(post: any): Observable<any> {
return this.http.put<any>(`${this.apiUrl}/${post.id}`, post);
}
deletePost(id: number): Observable<any> {
return this.http.delete<any>(`${this.apiUrl}/${id}`);
}Manejo de Errores
Es importante manejar errores en las solicitudes HTTP para mejorar la experiencia del usuario. Podemos utilizar el operador catchError de RxJS para esto.
-
Importa
catchErrorythrowErrordesderxjs. -
Añade un método para manejar errores en el servicio.
// data.service.ts
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
getPosts(): Observable<any> {
return this.http.get<any>(this.apiUrl).pipe(
catchError(this.handleError)
);
}
private handleError(error: any) {
console.error('An error occurred:', error);
return throwError('Something bad happened; please try again later.');
}Ejercicio Práctico
Ejercicio
- Crea un nuevo componente llamado
PostListComponentque muestre una lista de posts. - Añade un botón en el componente para añadir un nuevo post.
- Implementa el manejo de errores para las solicitudes GET y POST.
Solución
-
Crear el componente:
ng generate component post-list -
Implementar el componente y el servicio con manejo de errores:
// post-list.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from '../data.service';
@Component({
selector: 'app-post-list',
template: `
<div *ngIf="posts">
<h1>Posts</h1>
<ul>
<li *ngFor="let post of posts">{{ post.title }}</li>
</ul>
</div>
<button (click)="addPost()">Add Post</button>
<div *ngIf="errorMessage">{{ errorMessage }}</div>
`
})
export class PostListComponent implements OnInit {
posts: any;
errorMessage: string;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getPosts().subscribe(
data => {
this.posts = data;
},
error => {
this.errorMessage = error;
}
);
}
addPost() {
const newPost = { title: 'New Post', body: 'This is a new post.' };
this.dataService.addPost(newPost).subscribe(
post => {
this.posts.push(post);
},
error => {
this.errorMessage = error;
}
);
}
}// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'https://jsonplaceholder.typicode.com/posts';
constructor(private http: HttpClient) { }
getPosts(): Observable<any> {
return this.http.get<any>(this.apiUrl).pipe(
catchError(this.handleError)
);
}
addPost(post: any): Observable<any> {
return this.http.post<any>(this.apiUrl, post).pipe(
catchError(this.handleError)
);
}
private handleError(error: any) {
console.error('An error occurred:', error);
return throwError('Something bad happened; please try again later.');
}
}Conclusión
En esta sección, hemos aprendido cómo realizar solicitudes HTTP en Angular utilizando el módulo HttpClient. Hemos cubierto cómo realizar solicitudes GET y POST, así como manejar errores. Estos conceptos son fundamentales para interactuar con APIs y servicios web en aplicaciones Angular. En la próxima sección, profundizaremos en el manejo de respuestas HTTP y el uso de Observables.
Curso de Angular
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
- Configuración del Entorno de Desarrollo
- Arquitectura de Angular
- Primera Aplicación Angular
Módulo 2: Componentes de Angular
- Entendiendo los Componentes
- Creación de Componentes
- Plantillas de Componentes
- Estilos de Componentes
- Interacción entre Componentes
Módulo 3: Enlace de Datos y Directivas
- Interpolación y Enlace de Propiedades
- Enlace de Eventos
- Enlace de Datos Bidireccional
- Directivas Incorporadas
- Directivas Personalizadas
Módulo 4: Servicios e Inyección de Dependencias
- Introducción a los Servicios
- Creación y Uso de Servicios
- Inyección de Dependencias
- Inyectores Jerárquicos
Módulo 5: Enrutamiento y Navegación
Módulo 6: Formularios en Angular
- Formularios Basados en Plantillas
- Formularios Reactivos
- Validación de Formularios
- Formularios Dinámicos
Módulo 7: Cliente HTTP y Observables
- Introducción al Cliente HTTP
- Realizando Solicitudes HTTP
- Manejo de Respuestas HTTP
- Uso de Observables
- Manejo de Errores
Módulo 8: Gestión de Estado
- Introducción a la Gestión de Estado
- Uso de Servicios para la Gestión de Estado
- NgRx Store
- NgRx Effects
- NgRx Entity
Módulo 9: Pruebas en Angular
- Pruebas Unitarias
- Pruebas de Componentes
- Pruebas de Servicios
- Pruebas de Extremo a Extremo
- Simulación de Dependencias
Módulo 10: Conceptos Avanzados de Angular
- Angular Universal
- Optimización del Rendimiento
- Internacionalización (i18n)
- Pipes Personalizados
- Animaciones en Angular
