No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

19 Días
1 Hrs
43 Min
2 Seg

Obteniendo datos de una API

14/20
Recursos

Uno de los procesos asíncronos más comunes son las peticiones de datos desde una API. Para esto, Angular posee su propio cliente HTTP destinado a cumplir con el propósito llamado HttpClientModule.

Consumo de API con Angular

Paso 1: Comienza importando el módulo HttpClientModule, en el módulo principal de tu aplicación desde @angular/common/http.

// app.module.ts
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [
    // ..
  ],
  imports: [
    // ...
    HttpClientModule
  ],
  providers: [],
  bootstrap: [ /* .. */ ]
})
export class AppModule { }

Paso 2: Crea un servicio para realizar todos los llamados a una API que necesites. En este servicio tienes que importar el cliente HTTP de Angular y crear un método por cada endpoint para el que necesites efectuar una petición.

// services/api.service.ts
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(
    private http: HttpClient,
  ) { }
  
  getProducts() {
    return this.http.get(`https://example.com/api/productos`);
  }
}

Paso 3: Importa este nuevo servicio en tus componentes para efectuar los llamados a la API.

// components/catalogo/catalogo.component.ts
import { ApiService } from 'src/app/services/api.service';

@Component({
  selector: 'app-catalogo',
  templateUrl: './catalogo.component.html',
  styleUrls: ['./catalogo.component.scss']
})
export class CatalogoComponent implements OnInit {

  public productos: Producto[] = [];

  constructor(
    private apiService: ApiService
  ) { }

  ngOnInit(): void {
      this.apiService.getProducts()
        .subscribe(res => {
          this.productos = res;
        });
  }

  // ...
}

El método ngOnInit() es el lugar apropiado para los llamados asincrónicos, recuerda que no es buena práctica hacerlo en el constructor.

Todo el cliente HTTP de Angular está basado en Observables, por lo tanto, es recomendable suscribirse al método del servicio para obtener los datos cuando la API responda.

TIP: No es necesario que hagas un .unsubscribe() luego del llamado a la API. Angular ya lo hace por ti, cuando usas su cliente HTTP.

Jugando con observables

Si no tienes a tu disposición una API Rest que devuelva datos para tu aplicación, voy a enseñarte un pequeño truco para que aun así puedas continuar con tu desarrollo con un mock de datos.

Un Mock es una simulación de los datos reales que devolverá la API, salvo que esta vez obtendrás dichos datos desde el servicio a través de un Observable.

// services/api.service.ts
import { Observable, of } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor() { }

  getProducts(): Observable<Producto[]> {
    return of([
      {
        id: 1,
        name: 'Automobil de juguete',
        precio: 100,
        image: 'https://static3.depositphotos.com/1000865/118/i/600/depositphotos_1183767-stock-photo-toy-car.jpg'
      },
      {
        id: 2,
        name: 'Muñeca de trapo',
        precio: 180,
        image: 'https://kinuma.com/8869-home_default/muneca-de-trapo-mali.jpg'
      },
      {
        id: 3,
        name: 'Pelota de futbol',
        precio: 120,
        image: 'https://media.istockphoto.com/photos/soccer-ball-isolated-3d-rendering-picture-id1257575611?k=20&m=1257575611&s=612x612&w=0&h=g530fFJspT42xFGY7HycLvpBKLXpJ2XAkKCRyY-SK80='
      },
      {
        id: 4,
        name: 'Castillo',
        precio: 220,
        image: 'https://i.imgur.com/44nzvkQ.jpg'
      }
    ])
  }

}

En el ejemplo anterior, desde RxJS se está importando “Observable” y “of” que te ayudarán a preparar tus datos.

Con Observable puedes tipear la respuesta de tus métodos de la siguiente manera Observable<Producto[]> para indicar que este devolverá un observable con un array de productos. La función of convierte lo que sea que le pongas dentro (un objeto, un array, un número, etc), en un observable.

De esta forma, sin tener una API real, puedes simular la interacción de tu componente con datos provenientes de una proceso asincrónico.

Ver código fuente del proyecto


Contribución creada con los aportes de Kevin Fiorentino.

Aportes 31

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

en pasos:

En el servicio:
1- crear el servicio desde la terminal
2- importar el modulo HttpCliente en el servcio e inyectar e servicio en el constructor.
3 en el servicio se crea el metodo para hace la petición de la API:
return this.http.get<Product[]>(‘https://fakestoreapi.com/products’);

En el componente:
1- importar el servicio
2- inyectar el servicio en el constructor: private productsService: ProductsService
3- crear el metodo en el ngOnInit
this.productsService.getAllProducts()
.subscribe(data => {
this.products = data;

Por ultimo ya estaba creado un array tipado y se debe ajustar los campos con los campos de la API.

Chicos, hay una extension llamada JSON Viewer que les va a permitir ver los datos de un API de manera organizada, de lo contrario cuando abran la url no van a entender nada

Para la parte de tipado otra forma sería tomar la respuesta que nos da la API y crear una interfaz a partir de esta data. Para crear la interfaz uso https://app.quicktype.io/.

Una locura la manera en la que angula de manera indirecta le enseña a los desarrolladores algo de arquitectura.
crazy 👽

Excelente explicación, y muy buen curso, explicas muy bien Nicolas!
Deberías actualizar tu curso de Angular 8 en ese me perdí un poco 😦

Acaso hay algo mas hermoso que nico explicando extraordinariamente las cosas?
❤️ _ ❤️

Maravillosa clase. Todo claro y bien explicado.

El manejo de las peticiones a API suele ser algo complejo y en Angular se ve muy fácil de manejar.

El mejor momento para ejecutar código asíncrono es en:

ngOnInit() 

Les recomiendo guardar la url de la API en una variable:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Product } from '../models/product.model';

@Injectable({
  providedIn: 'root'
})
export class ProductsService {

  apiUrl: string = 'https://fakestoreapi.com/products';

  constructor(
    private http: HttpClient
  ) { }

  getAllProducts() {
    return this.http.get<Product[]>(this.apiUrl);
  }
}

cool, me ha encatado esto!

un Observable es un patrón de diseño que donde hay un sujeto que se suscribe a unos observadores.
Observable: flujo de datos, o coleccion de eventos, coleccion de elementos asincronas
Observers: funciones que estan escuchando ese flujo de datos (calback). Tambien es un Patron e igual Patron Iterador(Funcion map en programacion funcional https://www.educative.io/edpresso/how-observer-and-iterator-patterns-work-in-rxjs)
**Sujeto: ** sirve para distribuir varios Observers a la vez
Subscripcion: representa la ejecucucion de un Observable

Ventajas de un Observable Vs Promesa
promesa: 1 sola respuesta y NO es cancelable
Observable: flujo de respuestas, SI es cancelable

Otra manera de manejar una subscripción es la siguiente:

this._productsService.getAllProducts()
      .subscribe({
        next:(products) => {
          this.products = products;
        },
        error: (error) => {
          console.error(error);
        },
        complete: () => {

        }
      });

Que genialidad la forma en la que uso la interfaz para estandarizar la data

Que buena clase, nico explica muy bien, igual a repasar y practicar

Excelente explicación 😃.

Excelente clase, no entendia muy bien el modulo de http

Excelente clase ⭐

Al finalizar esta leccion el video se salta 4 lecciones, deberias seguir en la leccion 15-

En caso tal de que su interface de productos no concuerde con la API y quieran seguir usándola sin necesidad de cambiarla, pueden usar los pipes de los Observables para hacer una transformación y retornar un nuevo Observable con el tipado que se necesita.

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, Observable } from 'rxjs';
import { Product } from 'src/model/product.model';

@Injectable({
  providedIn: 'root'
})
export class ProductListService {

  constructor(
    private http: HttpClient
  ) { }

  getAllProducts(): Observable<Product[]> {
    return this.http.get<Record<string, any>[]>("https://fakestoreapi.com/products")
      .pipe(
        map((dataList: Record<string, any>[]) => {
          const products: Product[] = dataList.map( data => ({
            id: data["id"],
            imageUrl: data["image"],
            name: data["title"],
            price: data["price"],
            provider: data["category"]
          }));
          return products;
        })
      );
  }
}

Toda la vida soñando apreder a usar APIs y no pensé que hoy sería el día!

Con el pluggin thunder Client de vs code podemos hacer consultas a api’s como en postman 😄

Bueno, aquí sí que Angular hizo las cosas más complicadas de lo normal 😅

En el caso de que quieran tipar el método que retorna el observable, lo pueden hacer de la siguiente forma.

  getProducts() : Observable<Product[]> {
    return this.httpClient.get<Product[]>("https://fakestoreapi.com/products")
  }
Estuve batallando un chorro porque no encontraba el archivo **app.modules.ts** y me daba error con lo del **HttpClient**, con la solución que di es colocar el **provideHttpClient** en los **providers** de l **ApplicationConfig** en **app.config.ts.** ```js import { provideHttpClient } from '@angular/common/http'; export const appConfig: ApplicationConfig = { providers: [provideRouter(routes), provideClientHydration(), provideHttpClient()] }; ```*import* { provideHttpClient } *from* '@angular/common/http'; *export* const appConfig: ApplicationConfig = { providers: \[provideRouter(routes), provideClientHydration(), provideHttpClient()]};

Ese curso sera un joya y nos abrirá las puertas para realizar proyectos en donde tengamos que interactuar con APIs.
Adicional a eso quiero compartir esta herramienta llamada quicktype, para generar tipos de datos a partir de un JSON de una manera rápida y sencilla.

Literal, el mejor profe de angular.

Obteniendo datos de una API


Para obtener datos de una API en Angular, se pueden utilizar las funciones y métodos proporcionados por la librería HttpClient de Angular.

<aside>
<img src=“https://static.platzi.com/media/achievements/badge-angular-componentes-servicios-75f68ec3-48e0-430e-b7e2-889fad0d1984.png” alt=“https://static.platzi.com/media/achievements/badge-angular-componentes-servicios-75f68ec3-48e0-430e-b7e2-889fad0d1984.png” width=“40px” /> HttpClient es un módulo que proporciona una forma sencilla de hacer solicitudes HTTP en una aplicación Angular y recibir los resultados.

</aside>

Para utilizar HttpClient, se debe importar el módulo en el componente que lo utilizará. Para ello, se debe incluir la siguiente línea en el archivo que contiene el componente:

import { HttpClient } from '@angular/common/http';

A continuación, se debe crear una instancia de HttpClient en el constructor del componente:

constructor(private http: HttpClient) { }

Una vez que se ha creado una instancia de HttpClient, se pueden utilizar sus métodos para realizar solicitudes HTTP. El método más comúnmente utilizado es get(), que se utiliza para obtener datos de una API.

Para utilizar el método get(), se debe proporcionar una URL que apunte a la API de la que se desean obtener datos. Por ejemplo, si se desea obtener los datos de un usuario de GitHub, se podría utilizar la siguiente URL:

this.http.get('https://api.github.com/users/{nombre-de-usuario}').subscribe(data => {
  console.log(data);
});

El método get() devuelve un objeto Observable, que se puede suscribir para recibir los datos. En este ejemplo, los datos se imprimen en la consola del navegador utilizando el método console.log().

Es importante destacar que para utilizar HttpClient, es necesario importar el módulo HttpClientModule en el módulo principal de la aplicación. Para ello, se debe incluir la siguiente línea en el archivo que contiene el módulo:

import { HttpClientModule } from '@angular/common/http';

y agregar el HttpClientModule al arreglo de imports del NgModule.

@NgModule({
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  declarations: [ AppComponent ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

un compañero comento sobre una extensión para ver todo mejor los JSON aca esta https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh/related?hl=es

es una extension para google, no se si este para otros navegadores

Nicolas es el mejor profesor de habla hispana de angualr.

En el metodo ngOnInit del products.component.ts tuve que tipar data porque sino me tiraba error. Me quedo asi:

this.productsService.getAllProducts()
.subscribe((data:Product[]) => { this.products = data;});