En el siguiente enlace tienes el índice para acceder al resto de entradas de este tutorial:
Indice Tutorial Ionic >>
- Tutorial de Ionic - Construye Apps móviles multiplataforma con ionic desde cero
- Tutorial de Ionic - Instalar ionic y las herramientas necesarias para el desarrollo
- Tutorial de Ionic - Hola Mundo en Ionic
- Tutorial de Ionic - Estructura de un proyecto Ionic
- Tutorial de Ionic - Mini Juego de acertar números en ionic 2, el controlador de la página y Data Binding y *ngIF
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 1 - Navegación por Tabs
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 2: Mostrando el mapa.
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 3: Añadiendo FAB, marcador y ventana modal.
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 4 - Mostrando la dirección a partir de las coordenadas y sacando foto con la cámara.
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 5 - Guardando nuestros sitios en una base de datos local
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 6 - Mostrar detalles del sitio guardado y abrir navegador gps para llegar a el.
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 7 - Modificar nuestros sitios.
- Tutorial de Ionic - Crear una aplicación para guardar nuestros sitios geolocalizados - Parte 8 - Eliminar un sitio desde el listado deslizando el item con "ItemSliding".
- Tutorial de Ionic - Peticiones http - API REST
- Tutorial de Ionic - Firebase - parte 1: Autenticación con correo y contraseña
- Tutorial de Ionic - Firebase - parte 2: Database - Guardar nuestros sitios en la nube.
- Como mejorar el rendimiento de ionic en iOS y solución al problema de las peticiones http CORS
- Libro: Desarrollo de aplicaciones móviles multiplataforma y PWAs con Ionic y Firebase desde cero.
- Firmar el apk para subirlo a Google Play
- Mostrar un mapa offline en Ionic con Leaflet
- Directiva para mostrar y ocultar menú al hacer scroll en Ionic
- Como crear una app multi idioma con Ionic
- Como crear componentes personalizados con Ionic
Hola a todos, hoy vamos a ver como podemos comunicar una aplicación desarrollada con ionic con una API REST, para ello vamos a aprender como realizar peticiones a un servidor remoto a través de http.
En esta pequeña prueba vamos a ver como podemos acceder a una API REST para obtener desde un servidor remoto un listado de usuarios. Para este pequeño ejemplo vamos a utilizar RANDOM USER GENERATOR que como se indica en su web es una API libre de código abierto para generar datos de usuario aleatorios para realizar pruebas. Como Lorem Ipsum, pero con personas.
Lo que vamos a hacer es simplemente realizar una llamada a esta API donde recibiremos como respuesta un listado de usuarios que mostraremos en nuestra vista.
Antes de nada vamos a crear una nueva aplicación de prueba:
ionic start pruebahttp1 blank
Ahora vamos a crear un provider donde gestionaremos la comunicación con el servidor remoto:
ionic g provider http
Se habrá creado una carpeta providers (si no existía) y dentro una carpeta con el nombre del provider que acabamos de crear (http) y dentro un archivo .ts con el mismo nombre.
Por defecto contendrá el siguiente código:
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; /* Generated class for the HttpProvider provider. See https://angular.io/guide/dependency-injection for more info on providers and Angular DI. */ @Injectable() export class HttpProvider { constructor(public http: HttpClient) { console.log('Hello HttpProvider Provider'); } }
Vemos que al crear un provider ya se importa el módulo HttpClient.
Para poder utilizar HttpClient tenemos que importar y declarar HttpClientModule en el archivo app.module.ts:
import { BrowserModule } from '@angular/platform-browser'; import { ErrorHandler, NgModule } from '@angular/core'; import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; import { SplashScreen } from '@ionic-native/splash-screen'; import { StatusBar } from '@ionic-native/status-bar'; import { MyApp } from './app.component'; import { HomePage } from '../pages/home/home'; import { HttpProvider } from '../providers/http/http'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ MyApp, HomePage ], imports: [ BrowserModule, IonicModule.forRoot(MyApp), HttpClientModule ], bootstrap: [IonicApp], entryComponents: [ MyApp, HomePage ], providers: [ StatusBar, SplashScreen, {provide: ErrorHandler, useClass: IonicErrorHandler}, HttpProvider ] }) export class AppModule {}
http.get
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; /* Generated class for the HttpProvider provider. See https://angular.io/guide/dependency-injection for more info on providers and Angular DI. */ @Injectable() export class HttpProvider { path : string = 'https://randomuser.me/api/?results=25'; constructor(public http: HttpClient) { console.log('Hello HttpProvider Provider'); } loadUsers(){ return this.http .get(this.path) } }
{ "results": [ { "gender": "male", "name": { "title": "mr", "first": "romain", "last": "hoogmoed" }, "location": { "street": "1861 jan pieterszoon coenstraat", "city": "maasdriel", "state": "zeeland", "postcode": 69217 }, "email": "romain.hoogmoed@example.com", "login": { "username": "lazyduck408", "password": "jokers", "salt": "UGtRFz4N", "md5": "6d83a8c084731ee73eb5f9398b923183", "sha1": "cb21097d8c430f2716538e365447910d90476f6e", "sha256": "5a9b09c86195b8d8b01ee219d7d9794e2abb6641a2351850c49c309f1fc204a0" }, "dob": "1983-07-14 07:29:45", "registered": "2010-09-24 02:10:42", "phone": "(656)-976-4980", "cell": "(065)-247-9303", "id": { "name": "BSN", "value": "04242023" }, "picture": { "large": "https://randomuser.me/api/portraits/men/83.jpg", "medium": "https://randomuser.me/api/portraits/med/men/83.jpg", "thumbnail": "https://randomuser.me/api/portraits/thumb/men/83.jpg" }, "nat": "NL" } ], "info": { "seed": "2da87e9305069f1d", "results": 1, "page": 1, "version": "1.1" } }
<ion-header> <ion-navbar> <ion-title> Usuarios </ion-title> </ion-navbar> </ion-header> <ion-content> <ion-list> <ion-item *ngFor="let usuario of usuarios"> <ion-avatar item-start> <img [src]="usuario.picture.medium"> </ion-avatar> <h2>{{ usuario.name.first }}</h2> <p>{{ usuario.email }}</p> </ion-item> </ion-list> <button ion-button full (click) = "cargarUsuarios()">Cargar Usuarios</button> </ion-content>
import { HttpProvider } from '../../providers/http/http';
constructor(public navCtrl: NavController, public http: HttpProvider) { }
usuarios : any[];
Promesas y Observables
import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { HttpProvider } from '../../providers/http/http'; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { usuarios : any[]; constructor(public navCtrl: NavController, public http: HttpProvider) { } cargarUsuarios(){ this.http.loadUsers().subscribe( (res) => { this.usuarios = res['results']; }, (error) =>{ console.error(error); } ) } }
Como podemos observar llamamos al método loadUsers que hemos definido en el provider, pero no utilizamos then sino subscribe, esto es porque http no devuelve una promesa si no que devuelve un observable. Un observable se queda a la espera de recibir datos y nosotros nos “subscribimos” recibiendo estos datos en cuanto estén disponibles.
Esta cualidad se puede utilizar para suscribirnos a la url y observar si ha habido cambios, como por ejemplo si es un sitio de noticias donde se están continuamente renovando.
La diferencia entre promesas y observables a groso modo es que la promesa devuelve los datos una única vez cuando estos son recibidos mientras que un observable se queda “vigilando” si se han producido cambios y se ejecuta cada vez que un cambio se produce, aunque hasta que no te suscribes a un observable éste no se ejecutará.
Si solo necesitamos recibir los datos una única vez sin necesidad de observar si se han producido cambios podemos utilizar promesas. Una promesa se ejecuta una vez que se haya resuelto la llamada y recibimos los datos en la función .then(res=>{… }).
El código del provider en el archivo http.ts utilizando una promesa quedaría de la siguiente manera:
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import 'rxjs/add/operator/toPromise'; /* Generated class for the HttpProvider provider. See https://angular.io/guide/dependency-injection for more info on providers and Angular DI. */ @Injectable() export class HttpProvider { path : string = 'https://randomuser.me/api/?results=25'; constructor(public http: HttpClient) { console.log('Hello HttpProvider Provider'); } loadUsers(){ return this.http .get(this.path) .toPromise(); } }
Debemos importar el operador toPromise para convertir el observable en promesa con import ‘rxjs/add/operator/toPromise’; y simplemente añadir toPromise() después del get.
Ahora en home.ts solo tenemos que sustituir subscribe por then:
cargarUsuarios(){ this.http.loadUsers().then( (res) => { this.usuarios = res['results']; }, (error) =>{ console.error(error); } ) }
Si ejecutáis la aplicación con ionic serve -l y pulsáis en el botón Cargar Usuarios podréis ver algo como esto:
Podéis observar como cada vez que pulséis el botón la lista de usuarios cambia ya que Random User Generator como su propio nombre indica devuelve una lista aleatoria de usuarios.
http.post
RANDOM USER GENERATOR nos ha servido para aprender ha hacer una petición get a una API REST para recibir datos, en este caso una lista de usuarios.
Si queréis conectaros con un servicio que tengáis corriendo en un servidor remoto y necesitáis pasarle datos desde la aplicación para que se guarden en el servidor tenemos que usar http.post.
Vamos a imaginar que tenemos corriendo un servicio en PHP cuya url sea www.miservicio.com/adduser/ que está programado para recibir vía post un nuevo usuario para guardarlo en la base de datos del servidor.
Tendremos que crear una función similar a esta:
postDatos(){ let datos = { nombre:'Edu',email:'edu.revilla.vaquero@gmail.com'} let options = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; var url = 'www.miservicio.com/adduser/'; return new Promise(resolve => { this.http.post(url,JSON.stringify(datos),options) .subscribe(data => { resolve(data); }); }); }
En la variable datos tenemos un objeto con los datos del usuario que queremos enviar al servidor, en este caso nombre y email.
Después definimos la variable options donde a su vez definimos las cabeceras en la variable headers, dependiendo de la configuración del servidor podría necesitar parámetros diferentes en la cabecera.
Como vemos http.post es bastante parecido a http.get, solo que como segundo parámetro le pasamos la variable que contiene los datos que queremos enviar convertida a formato JSON con JSON.stringify(datos), como tercer parámetro le pasamos options.
En data recibiremos la respuesta que nos de el servidor.
Vamos a ver un ejemplo de como obtendríamos los datos enviados desde nuestra aplicación con un servicio desarrollado en PHP en el servidor:
<?php $postdata = file_get_contents("php://input"); if (isset($postdata)) { $request = json_decode($postdata); echo $request->nombre; echo $request->email; } ?>
Evidentemente en otros lenguajes de programación del lado del servidor el código para recibir los datos sería diferente, pero se escapa del propósito de este tutorial el abordar como sería en cada leguaje. Si alguno hace la prueba en otro lenguaje y quiere compartirlo en los comentarios para ayudar a los demás será bien recibido :-).
Eso es todo por hoy.
Si necesitas desarrollar una aplicación móvil no dudes en solicitarme un presupuesto sin compromiso:
Un saludo, y si aún no lo has hecho no olvides suscribirte a mi blog para no perderte los próximos posts :-),También puedes seguirme en Twitter en @revigames y no olvides que me ayudas mucho si compartes este post en las redes sociales.
Hola Edu, una vez más una entrada interesante que podemos realizar y entender en un tiempo máximo de 15 minutos.
Muchas gracias.
Gracias a ti Luís por seguir ahí 🙂
Hola Edu, genial el post, aclara muchisimas cosas y la verdad que explica el tema de los observables y promesas de forma que se entienda a la perfección… mis felicitaciones.
Quiero comentarte que tengo un problemilla, creo que lo tengo todo hecho como tu indicas en el post pero cuando lanzo la app en servidor y tambien en dispositivo me da un error cuando pulso el botón para que me descargue los datos.
este es el error:
Failed to navigate: No provider for HttpProvider!
¿tienes idea de que puedo estar haciendo mal?
// Importar Necesariamente estos dos///
import { HttpClientModule } from ‘@angular/common/http’;
import { HttpModule } from ‘@angular/http’;
Importa esos dos modulos
en el appModule.ts
Parabêns, ótimo tutorial.
Hola edu amo este blog, es genial todos tus tutos, pero tengo un problema, cuando intento testear en mi android me tira un error con la funcion json de loadusers(), mira:
[00:54:51] typescript: C:/Users/Jaime/Desktop/htdocs/Trabajo/hola-mundo/src/providers/http.ts, line: 23
Property ‘json’ does not exist on type ‘Object’.
L22: .get(this.path)
L23: .map(res => res.json(),
L24: err => {
[00:54:51] ionic-app-script task: “build”
[00:54:51] Error: Failed to transpile program
Error: Failed to transpile program
at new BuildError (C:\Users\Jaime\Desktop
Muchas gracias igual, y segui asi es genial!!
Hola Ezequiel:
A partir de la versión 4.3 de Angular han incorporado HttpClient en lugar de Http. Ionic ahora utiliza HttpClient por lo que Http ha quedado deprecado.
Acabo de actualizar el post para utilizar HttpClient en lugar de Http.
Muchas gracias por comentar
Un saludo
Que buena explicacion seria bueno que explicara un Api rest full (agregar,actualizar y eliminar registro desde ionic)
Hola Ezequiel,
Compré tu libro en Amazon apenas una semana después de que lo atualizaras a la versión 3 de Ionic (fue casualidad). Cuando llegué al capítulo del API Rest no me funcionaba nada y después de pelearme recordé que tinenes un blog (lo encontré poniendo tu nombre poco después de comprarlo). Con la actualización que has puesto aquí me funciona perfectamente. Sin embargo, estoy intentando hacer la parte no resuelta del http.post y obtengo un error de importación con el método “post”.
Aprovecho el mensaje para pedirte por favor bibliografía tuya o de otros autores, o curso online que me puedan servir para entender mejor este framework. ¿Merece la pena que me mire AngularJS si sólo me interesa Ionic por las app móviles y no “apps web”?
Felicitaciones por el libro. Sirve realmente para comenzar desde cero y es de lo poco que hay en castellano.
Hola Juanma,
Antes de nada gracias por comprar el libro.
Supongo que la consulta es para mi y no para Ezequiel :),
La verdad es que es complicado mantener el libro actualizado ya que con cada nueva versión de ionic salen funcionalidades nuevas y algunas cosas quedan obsoletas, intento no obstante tener el contenido lo más actualizado posible.
Por un lado para ver si puedo ayudarte ¿podrías indicar que error te sale exactamente al utilizar el método post?
Por otro lado libros en español sobre Ionic apenas hay, por eso me decidí a escribir uno, sin embargo cursos online si he visto varios, si buscas en google no te costará encontrar alguno.
Si te defiendes en inglés si que puedes encontrar algo más de material, tambien tienes la propia documentación oficial de ionic.
En cuanto a aprender AngularJS, te diré que en realidad se denomina así a la versión 1, a partir de la versión 2 se denomina simplemente Angular, esto es así porque son totalmente diferentes y no compatibles entre si.
Como Ionic se basa en Angular, aunque solo te interese desarrollar apps móviles si creo que es muy recomendable que trates de aprender Angular, aunque en mi libro explico conceptos básicos de Angular para defenderte con Ionic y empezar a desarrollar tus aplicaciones cuanto más sepas de Angular más herramientas tendrás para construir tus aplicaciones.
Si buscas en google no te costará encontrar cursos online y libros para aprender.
Un saludo
Ostras sí, entre el Ezequiel del otro comentario y mi compañero de trabajo (también se llama así) me he liado. Sobre el error del método “http.post” ya está resuelto, era culpa mía.
En un par de semanas comenzaré por el capítulo de Firebase.
Gracias por tu pronta respuesta.
Un saludo.
Hola Eduardo,
estoy intentando ejecutar el comando ionic g provider http pero me esta saliendo este error:
Error: Cannot find module ‘C:\Users\MORENO ARAQUE\Desktop\pruebahttp1\node_modules\@ionic\app-scripts’
Que paso estoy omitiendo o que estoy haciendo mal? Gracias
Esto en VisualstudioCode Windows 10
Hola Sebastian, prueba a instalar la versión más reciente de app-scripts con el siguiente comando:
npm install @ionic/app-scripts@latest –save-dev
Un saludo
no me sale el post hice como el tuyo cambie mi url por una local pero la parte de header debe ir exactamente igual al de tu blog o debo cambiar??
Hola eduardo,
Logré hacer el ejemplo de este post satisfactoriamente, muy bueno por cierto.
Quiero hacer la coneccion con un webservice creado con node.js pero en la consola me arroja el siguiente error:
from origin ‘http://localhost:8100’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
ya realize los pasos de tu post: ‘Como mejorar el rendimiento de ionic en iOS y solución al problema de las peticiones http CORS’
pero sigo obteniendo el mismo error
de antemano gracias
Muchas gracias, excelente el articulo, probe el http.get y corre sin problemas, pero probe el http.post y me sale el siguiente error:
ERROR Error: Uncaught (in promise): TypeError: _this.http.post is not a function
TypeError: _this.http.post is not a function