20. Haciendo peticiones a la API

 

Tutorial 20: Haciendo peticiones a la API

馃殌 Transformando nuestra funci贸n para consumir la API

Vamos a modificar nuestra funci贸n reqApi para que realmente haga la petici贸n a la API de Rick & Morty y obtenga los datos que necesitamos.

Paso 1: Hacer la funci贸n as铆ncrona

Primero, actualizamos nuestra funci贸n para que sea async:

javascript

// En tu App.js, reemplaza la funci贸n reqApi actual por:

const reqApi = async () => {

  // Quitamos el console.log anterior

  console.log("Haciendo petici贸n a la API...");

};

¿Por qu茅 async?

  • Nos permite usar await dentro de la funci贸n

  • Facilita el manejo de promesas

  • Hace el c贸digo m谩s limpio y legible

Paso 2: Hacer la petici贸n con fetch

Vamos a usar la API de fetch que viene incluida en los navegadores modernos:

javascript

const reqApi = async () => {

  // Hacemos la petici贸n a la API

  const api = await fetch("https://rickandmortyapi.com/api/character");

  

  console.log("Respuesta de la API:", api);

};

URL de la API: https://rickandmortyapi.com/api/character

Paso 3: Probar la petici贸n

  1. Guarda los cambios (Ctrl + S)

  2. Abre la consola del navegador (F12 → pesta帽a "Console")

  3. Haz clic en "Buscar personajes"

  4. Deber铆as ver algo como:

text

Respuesta de la API: Response {type: "cors", url: "...", redirected: false, status: 200, ok: true, …}

Paso 4: Convertir la respuesta a JSON

La respuesta de fetch es un objeto Response. Necesitamos convertirlo a JSON para poder trabajar con los datos:

javascript

const reqApi = async () => {

  // Hacemos la petici贸n

  const api = await fetch("https://rickandmortyapi.com/api/character");

  

  // Convertimos la respuesta a JSON

  const characterApi = await api.json();

  

  console.log("Datos en formato JSON:", characterApi);

};

Paso 5: Examinar la respuesta completa

Haz clic en el bot贸n nuevamente y examina lo que aparece en consola:

javascript

// La estructura completa que ver谩s es:

{

  "info": {

    "count": 826,      // Total de personajes

    "pages": 42,       // Total de p谩ginas

    "next": "https://...?page=2",  // URL siguiente p谩gina

    "prev": null       // URL p谩gina anterior (null si es la primera)

  },

  "results": [         // Array con los personajes

    { /* primer personaje */ },

    { /* segundo personaje */ },

    // ... 20 personajes en total

  ]

}

Paso 6: Ver los datos espec铆ficos

Vamos a hacer console.log m谩s espec铆ficos para entender mejor los datos:

javascript

const reqApi = async () => {

  const api = await fetch("https://rickandmortyapi.com/api/character");

  const characterApi = await api.json();

  

  // Informaci贸n general

  console.log("Total personajes en la API:", characterApi.info.count);

  console.log("Total p谩ginas:", characterApi.info.pages);

  console.log("Personajes en esta p谩gina:", characterApi.results.length);

  

  // Primer personaje para examinar

  console.log("Primer personaje:", characterApi.results[0]);

  

  // Todos los nombres

  console.log("Nombres de todos los personajes:");

  characterApi.results.forEach((personaje, index) => {

    console.log(`${index + 1}. ${personaje.name}`);

  });

};

Paso 7: Analizar la estructura de un personaje

Cuando examines characterApi.results[0], ver谩s:

javascript

{

  "id": 1,

  "name": "Rick Sanchez",

  "status": "Alive",

  "species": "Human",

  "type": "",

  "gender": "Male",

  "origin": {

    "name": "Earth (C-137)",

    "url": "https://rickandmortyapi.com/api/location/1"

  },

  "location": {

    "name": "Citadel of Ricks",

    "url": "https://rickandmortyapi.com/api/location/3"

  },

  "image": "https://rickandmortyapi.com/api/character/avatar/1.jpeg",

  "episode": [

    "https://rickandmortyapi.com/api/episode/1",

    "https://rickandmortyapi.com/api/episode/2",

    // ... m谩s episodios

  ],

  "url": "https://rickandmortyapi.com/api/character/1",

  "created": "2017-11-04T18:48:46.250Z"

}

馃攳 Validando que la petici贸n sea exitosa

Es buena pr谩ctica verificar que la petici贸n fue exitosa:

javascript

const reqApi = async () => {

  try {

    const api = await fetch("https://rickandmortyapi.com/api/character");

    

    // Verificar que la respuesta sea OK

    if (!api.ok) {

      throw new Error(`Error HTTP: ${api.status}`);

    }

    

    const characterApi = await api.json();

    

    console.log("¡Petici贸n exitosa!");

    console.log("Status:", api.status); // Deber铆a ser 200

    console.log("Primer personaje:", characterApi.results[0].name);

    

  } catch (error) {

    console.error("Error al hacer la petici贸n:", error);

  }

};

馃搳 C贸digo completo de la funci贸n hasta ahora:

javascript

const reqApi = async () => {

  console.log("Iniciando petici贸n a la API...");

  

  try {

    // 1. Hacer la petici贸n

    const api = await fetch("https://rickandmortyapi.com/api/character");

    

    // 2. Verificar que fue exitosa

    if (!api.ok) {

      throw new Error(`Error: ${api.status} - ${api.statusText}`);

    }

    

    // 3. Convertir a JSON

    const characterApi = await api.json();

    

    // 4. Mostrar informaci贸n 煤til

    console.log("✅ Petici贸n exitosa!");

    console.log("馃搳 Total personajes disponibles:", characterApi.info.count);

    console.log("馃搫 Personajes obtenidos:", characterApi.results.length);

    console.log("馃懁 Ejemplo - Primer personaje:", {

      nombre: characterApi.results[0].name,

      estado: characterApi.results[0].status,

      especie: characterApi.results[0].species,

      episodios: characterApi.results[0].episode.length,

      imagen: characterApi.results[0].image

    });

    

    // 5. Mostrar todos los nombres

    console.log("馃搵 Lista completa de nombres:");

    characterApi.results.forEach((p, i) => {

      console.log(`${i + 1}. ${p.name} - ${p.status} - ${p.species}`);

    });

    

  } catch (error) {

    console.error("❌ Error en la petici贸n:", error);

    alert("Hubo un error al cargar los personajes. Verifica tu conexi贸n.");

  }

};

馃И Prueba de funcionamiento

Lo que deber铆as ver en consola al hacer clic:

text

Iniciando petici贸n a la API...

✅ Petici贸n exitosa!

馃搳 Total personajes disponibles: 826

馃搫 Personajes obtenidos: 20

馃懁 Ejemplo - Primer personaje: {nombre: "Rick Sanchez", estado: "Alive", especie: "Human", episodios: 51, imagen: "https://..."}

馃搵 Lista completa de nombres:

1. Rick Sanchez - Alive - Human

2. Morty Smith - Alive - Human

3. Summer Smith - Alive - Human

4. Beth Smith - Alive - Human

5. Jerry Smith - Alive - Human

... y as铆 sucesivamente

⚠️ Errores comunes y soluciones

Error 1: "Failed to fetch"

javascript

// Posibles causas:

// 1. Sin conexi贸n a internet

// 2. URL mal escrita

// 3. Problemas de CORS (aunque esta API lo permite)


// Soluci贸n: Verifica la URL

const api = await fetch("https://rickandmortyapi.com/api/character");

// NOTA: Aseg煤rate de que sea HTTPS y no HTTP

Error 2: "Unexpected token < in JSON"

javascript

// Causa: El servidor devuelve HTML en lugar de JSON

// Soluci贸n: Verifica que la API est茅 funcionando

// Puedes probar la URL directamente en el navegador

Error 3: La consola no muestra nada

javascript

// Causas posibles:

// 1. No guardaste los cambios (Ctrl + S)

// 2. La consola est谩 filtrada (aseg煤rate de ver "All" o "Default")

// 3. Hay un error silencioso

馃敆 Verificaci贸n manual de la API

Si tienes dudas sobre si la API funciona, puedes:

  1. Abrir directamente en el navegador: https://rickandmortyapi.com/api/character

  2. Usar curl en terminal: curl https://rickandmortyapi.com/api/character

  3. Usar herramientas como Postman

馃幆 ¿Qu茅 hemos logrado?

✅ Creamos una funci贸n as铆ncrona
✅ Hicimos peticiones a una API real
✅ Convertimos la respuesta a JSON
✅ Validamos que la petici贸n sea exitosa
✅ Exploramos la estructura de los datos
✅ Implementamos manejo de errores b谩sico

馃摑 Actividad pr谩ctica

Modifica tu c贸digo para que:

  1. Muestre solo personajes que est茅n vivos (status === "Alive")

  2. Cuente cu谩ntos personajes son humanos (species === "Human")

  3. Encuentre el personaje con m谩s episodios

javascript

// Ejemplo de soluci贸n parcial

const vivos = characterApi.results.filter(p => p.status === "Alive");

console.log(`Personajes vivos: ${vivos.length}`);


const humanos = characterApi.results.filter(p => p.species === "Human");

console.log(`Personajes humanos: ${humanos.length}`);


const masEpisodios = characterApi.results.reduce((prev, current) => {

  return prev.episode.length > current.episode.length ? prev : current;

});

console.log(`Personaje con m谩s episodios: ${masEpisodios.name} (${masEpisodios.episode.length})`);

馃殌 Pr贸ximo paso

¡Excelente! Ya estamos obteniendo los datos de la API. En el siguiente tutorial vamos a:

  1. Almacenar estos datos en el estado de React

  2. Actualizar la interfaz para mostrar los personajes

  3. Crear un componente espec铆fico para mostrar cada personaje


¿Lograste ver la lista completa de personajes en tu consola? ¡Comparte cu谩l es tu personaje favorito que apareci贸 en la lista! 馃専

¿Tuviste alg煤n problema con la petici贸n? ¡Describe el error en los comentarios para ayudarte


Comentarios

Entradas m谩s populares de este blog

9.3-Tutorial de Componentes React con Props -SSS

9.6-Ciclo de Vida de un Componente React

9-Componentes en React-estado