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.

  1. Abre el archivo app.module.ts.
  2. Importa HttpClientModule desde @angular/common/http.
  3. Añade HttpClientModule a la lista de imports en 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.

  1. Crea un nuevo servicio utilizando Angular CLI:

    ng generate service data
    
  2. En el archivo data.service.ts, importa HttpClient y Observable desde @angular/common/http y rxjs respectivamente.

  3. Inyecta HttpClient en 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);
  }
}
  1. En un componente, inyecta el servicio DataService y utiliza el método getPosts para 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.

  1. En el archivo data.service.ts, añade un nuevo método addPost.
// data.service.ts
addPost(post: any): Observable<any> {
  return this.http.post<any>(this.apiUrl, post);
}
  1. 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.

  1. Importa catchError y throwError desde rxjs.

  2. 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

  1. Crea un nuevo componente llamado PostListComponent que muestre una lista de posts.
  2. Añade un botón en el componente para añadir un nuevo post.
  3. Implementa el manejo de errores para las solicitudes GET y POST.

Solución

  1. Crear el componente:

    ng generate component post-list
    
  2. 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

Módulo 2: Componentes de Angular

Módulo 3: Enlace de Datos y Directivas

Módulo 4: Servicios e Inyección de Dependencias

Módulo 5: Enrutamiento y Navegación

Módulo 6: Formularios en Angular

Módulo 7: Cliente HTTP y Observables

Módulo 8: Gestión de Estado

Módulo 9: Pruebas en Angular

Módulo 10: Conceptos Avanzados de Angular

Módulo 11: Despliegue y Mejores Prácticas

© Copyright 2024. Todos los derechos reservados