Cómo utilizar la API Fetch de JavaScript para obtener datos

Introducción
Hubo un tiempo en que XMLHttpRequest
se usaba para hacer solicitudes de API. No incluía promesas y no permitía que el código JavaScript fuera limpio. Con jQuery, se podía usar la sintaxis más limpia de jQuery.ajax()
.
Ahora, JavaScript tiene su propia forma integrada de realizar solicitudes API. Se trata de la Fetch API, un nuevo estándar para realizar solicitudes al servidor con Promesas, pero que también incluye funciones adicionales.
En este tutorial, creará solicitudes GET y POST utilizando la API Fetch.
Implemente sus aplicaciones frontend desde GitHub con la plataforma de aplicaciones DigitalOcean . Deje que DigitalOcean se concentre en escalar su aplicación.
Prerrequisitos
Para completar este tutorial, necesitará lo siguiente:
- Un entorno de desarrollo local para Node.js. Sigue Cómo instalar Node.js y crear un entorno de desarrollo local .
- Un conocimiento básico de codificación en JavaScript, sobre el que puede obtener más información en la serie Cómo codificar en JavaScript .
- Comprensión de las promesas en JavaScript. Lea la sección Promesas de este artículo sobre el bucle de eventos, las devoluciones de llamadas, las promesas y async/await en JavaScript.
Paso 1: Introducción a la sintaxis de la API Fetch
Un enfoque para utilizar la API Fetch es pasar fetch()
la URL de la API como parámetro:
fetch(url)
El fetch()
método devuelve una Promesa. Después del fetch()
método, incluya el método Promesa then()
:
fetch(url) .then(function() { // handle the response })
Si la Promesa devuelta es , se ejecuta resolve
la función dentro del método. Esa función contiene el código para manejar los datos recibidos de la API.then()
Después del then()
método, incluya el catch()
método:
fetch(url) .then(function() { // handle the response }) .catch(function() { // handle the error });
La API que llamas fetch()
puede estar inactiva o pueden ocurrir otros errores. Si esto sucede, reject
se devolverá la promesa. El catch
método se utiliza para gestionar reject
. El código que se encuentra dentro catch()
se ejecutará si ocurre un error al llamar a la API que elijas.
Una vez que comprenda la sintaxis para usar la API Fetch, ahora puede pasar a usarla fetch()
en una API real.
Paso 2: uso de Fetch para obtener datos de una API
Los siguientes ejemplos de código se basarán en la API JSONPlaceholder . Con la API, obtendrá diez usuarios y los mostrará en la página mediante JavaScript. Este tutorial recuperará datos de la API JSONPlaceholder y los mostrará en elementos de lista dentro de la lista del autor.
Comience creando un archivo HTML y agregando un encabezado y una lista desordenada con el símbolo id
de authors
:
autores.html
h1Authors/h1ul/ul
Ahora, agrega script
etiquetas al final de tu archivo HTML y usa un selector DOM para capturar el ul
. Usa getElementById
with authors
como argumento:
autores.html
h1Authors/h1ul/ulscript const ul = document.getElementById('authors');/script
Recuerde, authors
es id
para el creado previamente ul
.
A continuación, crea un list
que sea DocumentFragment
:
autores.html
script // ... const list = document.createDocumentFragment();/script
Todos los elementos de la lista adjunta se agregarán a list
. A DocumentFragment
no forma parte de la estructura de árbol del documento activo. Esto tiene la ventaja de no provocar redibujados que afecten el rendimiento cuando se modifica el modelo de objetos del documento.
Crea una variable constante llamada url
que contendrá la URL de la API que devolverá diez usuarios aleatorios:
autores.html
script // ... const url = 'https://jsonplaceholder.typicode.com/users';/script
Ahora, utilizando la API Fetch, llame a la API JSONPlaceholder usando fetch()
with url
como argumento:
autores.html
script // ... fetch(url)/script
Estás llamando a la API Fetch y pasando la URL a la API JSONPlaceholder. Luego, se recibe una respuesta. Sin embargo, la respuesta que obtienes no es JSON, sino un objeto con una serie de métodos que se pueden usar según lo que quieras hacer con la información. Para convertir el objeto devuelto en JSON, usa el json()
método.
Agregue el then()
método que contendrá una función con un parámetro llamado response
:
autores.html
script // ... fetch(url) .then((response) = {})/script
El response
parámetro toma el valor del objeto devuelto desde fetch(url)
. Utilice el json()
método para convertirlo response
en datos JSON:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); })/script
Aún es necesario procesar los datos JSON. Agregue otra then()
declaración con una función que tenga un argumento llamado data
:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = {})/script
Dentro de esta función, crea una variable llamada authors
que se establece igual a data
:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; })/script
Para cada autor de authors
, deberá crear un elemento de lista que muestre su nombre. El map()
método es adecuado para este patrón:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; authors.map(function(author) { }); })/script
Dentro de la map
función, crea una variable llamada li
que se establecerá como igual a createElement
con li
(el elemento HTML) como argumento. Además, crea un h2
for name
y un span
for email
:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; authors.map(function(author) { let li = document.createElement('li'); let name = document.createElement('h2'); let email = document.createElement('span'); }); })/script
El h2
elemento contendrá el name
de author
. El span
elemento contendrá el correo electrónico de author
. La innerHTML
propiedad y la interpolación de cadenas le permitirán hacer esto:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; authors.map(function(author) { let li = document.createElement('li'); let name = document.createElement('h2'); let email = document.createElement('span'); name.innerHTML = `${author.name}`; email.innerHTML = `${author.email}`; }); })/script
A continuación, conecte estos elementos DOM con appendChild
:
autores.html
script // ... fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; authors.map(function(author) { let li = document.createElement('li'); let name = document.createElement('h2'); let email = document.createElement('span'); name.innerHTML = `${author.name}`; email.innerHTML = `${author.email}`; li.appendChild(name); li.appendChild(email); list.appendChild(li); }); }) ul.appendChild(list);/script
Tenga en cuenta que cada elemento de la lista se agrega al DocumentFragment
list
. Una vez que el map
está completo, el list
se agrega al ul
elemento de la lista desordenada.
Una vez que hayas completado ambas then()
funciones, puedes agregar la catch()
función que registrará el posible error en la consola:
autores.html
script // ... fetch(url) .then((response) = { // ... }) .then((data) = { // ... }) .catch(function(error) { console.log(error); }); // .../script
Este es el código completo de la solicitud que creaste:
autores.html
h1Authors/h1ul/ulscript const ul = document.getElementById('authors'); const list = document.createDocumentFragment(); const url = 'https://jsonplaceholder.typicode.com/users'; fetch(url) .then((response) = { return response.json(); }) .then((data) = { let authors = data; authors.map(function(author) { let li = document.createElement('li'); let name = document.createElement('h2'); let email = document.createElement('span'); name.innerHTML = `${author.name}`; email.innerHTML = `${author.email}`; li.appendChild(name); li.appendChild(email); list.appendChild(li); }); }). .catch(function(error) { console.log(error); }); ul.appendChild(list);/script
Acabas de realizar una solicitud GET con éxito mediante la API JSONPlaceholder y la API Fetch. En el siguiente paso, realizarás solicitudes POST.
Paso 3: Manejo de solicitudes POST
La obtención predeterminada son las solicitudes GET, pero puedes usar todos los demás tipos de solicitudes, cambiar los encabezados y enviar datos. Vamos a crear una solicitud POST.
Primero, incluya una variable constante que contenga el enlace a la API JSONPlaceholder:
nuevo-autor.js
const url = 'https://jsonplaceholder.typicode.com/users';
A continuación, debe configurar su objeto y pasarlo como segundo argumento de la función de búsqueda. Este será un objeto llamado data
con la clave name
y el valor Sammy
(o su nombre):
nuevo-autor.js
// ...let data = { name: 'Sammy'}
Dado que se trata de una solicitud POST, deberá indicarlo explícitamente. Cree un objeto llamado fetchData
:
nuevo-autor.js
// ...let fetchData = {}
Este objeto debe incluir tres claves: method
, body
, y headers
:
nuevo-autor.js
// ...let fetchData = { method: 'POST', body: JSON.stringify(data), headers: new Headers({ 'Content-Type': 'application/json; charset=UTF-8' })}
La method
clave tendrá el valor 'POST'
. body
se establecerá igual al JSON.stringify()
formato del data
objeto que se acaba de crear. headers
tendrá el valor de 'Content-Type': 'application/json; charset=UTF-8'
.
La Headers
interfaz es una propiedad de la API Fetch, que le permite realizar acciones en los encabezados de solicitud y respuesta HTTP. Este artículo llamado Cómo definir rutas y métodos de solicitud HTTP en Express puede brindarle más información.
Con este código en su lugar, la solicitud POST se puede realizar mediante la API Fetch. Incluirá url
y fetchData
como argumentos para su fetch
solicitud POST:
nuevo-autor.js
// ...fetch(url, fetchData)
La then()
función incluirá código que maneja la respuesta recibida de la API JSONPlaceholder:
nuevo-autor.js
// ...fetch(url, fetchData) .then(function() { // Handle response you get from the API });
Este es el código completo de la solicitud que creaste:
nuevo-autor.js
const url = 'https://jsonplaceholder.typicode.com/users';let data = { name: 'Sammy'}let fetchData = { method: 'POST', body: JSON.stringify(data), headers: new Headers({ 'Content-Type': 'application/json; charset=UTF-8' })}fetch(url, fetchData) .then(function() { // Handle response you get from the API });
Alternativamente, puedes pasar fetch()
un Request
objeto.
nueva-solicitud-de-autor.js
const url = 'https://jsonplaceholder.typicode.com/users';let data = { name: 'Sammy'}let request = new Request(url, { method: 'POST', body: JSON.stringify(data), headers: new Headers({ 'Content-Type': 'application/json; charset=UTF-8' })});fetch(request) .then(function() { // Handle response you get from the API });
Con este enfoque, request
se puede utilizar como único argumento para fetch()
, reemplazando url
y fetchData
.
Ahora conoce dos métodos para crear y ejecutar solicitudes POST con la API Fetch.
Conclusión
Si bien la API Fetch aún no es compatible con todos los navegadores, es una excelente alternativa XMLHttpRequest
.
Si desea aprender cómo llamar a las API web usando React, consulte este artículo sobre este mismo tema.
Deja una respuesta