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.
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.
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.tsimport{Observable,of}from'rxjs';@Injectable({providedIn:'root'})exportclassApiService{constructor(){}getProducts():Observable<Producto[]>{returnof([{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.
Conexión a APIs usando HTTP Client Module en Angular
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/.
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
el complete es la función que siempre se ejecuta. Ya sea que se reciba algo por la suscripción. O que caiga un error. Después de una de esas dos siempre se ejecuta el complete().