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 cual es esencial para la mayoría de las aplicaciones web modernas.
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 para obtener datos de una API.
- 
Crea un nuevo servicio utilizando Angular CLI:
ng generate service data - 
Abre el archivo
data.service.tsy añade el siguiente código: 
// 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);
  }
}- Ahora, inyecta este servicio en un componente y utiliza el método 
getPostspara 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>
  `,
  styleUrls: ['./app.component.css']
})
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 a un servidor. Vamos a modificar nuestro servicio para incluir un método que realice una solicitud POST.
- Añade el siguiente método al archivo 
data.service.ts: 
// data.service.ts
import { HttpHeaders } from '@angular/common/http';
// ...
addPost(post: any): Observable<any> {
  const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
  return this.http.post<any>(this.apiUrl, post, { headers });
}- Modifica el componente para incluir un formulario que permita añadir un nuevo post.
 
// app.component.ts
import { FormBuilder, FormGroup } from '@angular/forms';
// ...
export class AppComponent implements OnInit {
  posts: any;
  postForm: FormGroup;
  constructor(private dataService: DataService, private fb: FormBuilder) {
    this.postForm = this.fb.group({
      title: [''],
      body: ['']
    });
  }
  ngOnInit() {
    this.dataService.getPosts().subscribe(data => {
      this.posts = data;
    });
  }
  onSubmit() {
    this.dataService.addPost(this.postForm.value).subscribe(newPost => {
      this.posts.push(newPost);
    });
  }
}- Actualiza la plantilla para incluir el formulario.
 
<!-- app.component.html -->
<div *ngIf="posts">
  <h1>Posts</h1>
  <ul>
    <li *ngFor="let post of posts">{{ post.title }}</li>
  </ul>
</div>
<form [formGroup]="postForm" (ngSubmit)="onSubmit()">
  <label for="title">Title:</label>
  <input id="title" formControlName="title">
  
  <label for="body">Body:</label>
  <textarea id="body" formControlName="body"></textarea>
  
  <button type="submit">Add Post</button>
</form>Manejo de Errores
Es importante manejar los errores que puedan ocurrir durante las solicitudes HTTP. Podemos utilizar el operador catchError de RxJS para esto.
- Modifica el método 
getPostsendata.service.tspara manejar errores: 
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 servicio llamado 
user.service.tsque realice solicitudes GET y POST a la APIhttps://jsonplaceholder.typicode.com/users. - En el componente principal, muestra una lista de usuarios y un formulario para añadir un nuevo usuario.
 
Solución
- 
Crea el servicio:
ng generate service user - 
Implementa el servicio:
 
// user.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } 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).pipe(
      catchError(this.handleError)
    );
  }
  addUser(user: any): Observable<any> {
    const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
    return this.http.post<any>(this.apiUrl, user, { headers }).pipe(
      catchError(this.handleError)
    );
  }
  private handleError(error: any) {
    console.error('An error occurred:', error);
    return throwError('Something bad happened; please try again later.');
  }
}- Modifica el componente principal:
 
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { UserService } from './user.service';
@Component({
  selector: 'app-root',
  template: `
    <div *ngIf="users">
      <h1>Users</h1>
      <ul>
        <li *ngFor="let user of users">{{ user.name }}</li>
      </ul>
    </div>
    <form [formGroup]="userForm" (ngSubmit)="onSubmit()">
      <label for="name">Name:</label>
      <input id="name" formControlName="name">
      
      <label for="email">Email:</label>
      <input id="email" formControlName="email">
      
      <button type="submit">Add User</button>
    </form>
  `,
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  users: any;
  userForm: FormGroup;
  constructor(private userService: UserService, private fb: FormBuilder) {
    this.userForm = this.fb.group({
      name: [''],
      email: ['']
    });
  }
  ngOnInit() {
    this.userService.getUsers().subscribe(data => {
      this.users = data;
    });
  }
  onSubmit() {
    this.userService.addUser(this.userForm.value).subscribe(newUser => {
      this.users.push(newUser);
    });
  }
}Conclusión
En esta sección, hemos aprendido cómo realizar solicitudes HTTP GET y POST utilizando el módulo HttpClient de Angular. También hemos visto cómo manejar errores en nuestras solicitudes HTTP. Estos conceptos son fundamentales para interactuar con APIs y servidores en aplicaciones web modernas.
En la próxima sección, exploraremos cómo manejar las respuestas HTTP y cómo trabajar con Observables para gestionar flujos de datos asíncronos en Angular.
Curso de Angular 2+
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
 - Configuración del Entorno de Desarrollo
 - Tu Primera Aplicación Angular
 - Arquitectura de Angular
 
Módulo 2: Conceptos Básicos de TypeScript
- Introducción a TypeScript
 - Variables y Tipos de Datos en TypeScript
 - Funciones y Funciones Flecha
 - Clases e Interfaces
 
Módulo 3: Componentes y Plantillas
- Creación de Componentes
 - Plantillas de Componentes
 - Estilos de Componentes
 - Interacción entre Componentes
 
Módulo 4: Directivas y Pipes
Módulo 5: 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 6: Enrutamiento y Navegación
Módulo 7: Formularios en Angular
- Formularios Basados en Plantillas
 - Formularios Reactivos
 - Validación de Formularios
 - Formularios Dinámicos
 
Módulo 8: Cliente HTTP y Observables
- Introducción al Cliente HTTP
 - Realizando Solicitudes HTTP
 - Manejo de Respuestas HTTP
 - Uso de Observables
 
Módulo 9: 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
 
