Javascript nos brinda una forma alternativa de realizar las peticiones HTTP utilizando async
y el operador await
async
hace que una función devuelva una Promesaawait
hace que una función espere una Promesa
Nota: La finalidad de las funciones async/await es simplificar el comportamiento del uso síncrono de promesas y realizar algún comportamiento específico en un grupo de Promises. Del mismo modo que las Promises son semejantes a las devoluciones de llamadas estructuradas, async/await se asemejan a una combinación de generadores y promesas.
En JavaScript el método fetch()
requiere dos parámetros:
- el primero parámetro es un string
''
que contiene la uri del endpoint, que normalmente está compuesta por dos partes:- la primera es la url que es la base de la API
- la segunda es lo que agregas para obtener ell endpoint completo
- el segundo parámetro es un objeto
{}
de opciones que contiene configuraciones para personalizar la solicitud, por ejemplo: method, headers, body, y otros más.
Documentación: fetch()
Comencemos con un ejemplo simple utilizando el método GET y lo analizamos
const getData = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
if (!response.ok) {
// Aquí manejamos el error que devolvió el request HTTP
console.log('error: ', response.status, response.statusText);
return {error: {status: response.status, statusText: response.statusText}};
};
const data = await response.json();
return data;
};
Recordemos que GET es el método por default. Por ello no es obligatorio escribir el segundo parámetro del fetch()
Analicemos esta función
- Definimos una arrow function, y la denominamos con un nombre significativo, en este ejemplo getData
- Determinamos que esa función flecha será asíncrona
async
porque es una petición HTTP y su respuesta no es inmediata - A continuación, definimos una constante
response
que esperaráawait
la respuesta delfetch()
. En esa constante almacenamos la respuesta de la petición. - Luego evalúamos la respuesta. (Esto comprueba con el valor de
response.ok
- Si la respuesta no es válida, registramos el error que nos brinda el protocolo HTTP (100, 300, 400, 500) y si es necesario realizamos acciones para darle tratamiento a ese error.
- Si la respuesta es válida, en la constante
data
guardaremos los datos con formato JSON y retornamos esa respuesta.
Nota: El protocolo HTTP siempre nos brindará una respuesta. Si esa respuesta es buena o no lo sabremos mediante los Códigos de estado de respuesta HTTP
Ahora hagamos un código más completo
const url_base = 'https://jsonplaceholder.typicode.com';
const getData = async () => {
const url = url_base + '/posts';
const options = {
method: "GET"
};
const response = await fetch(url, options);
if (!response.ok) {
/* Aquí manejamos el error que devolvió el request HTTP */
console.log('error: ', response.status, response.statusText);
return {error: {status: response.status, statusText: response.statusText}};
}
const data = await response.json();
return data;
};
Ahora que ya conocemos como funciona, veamos un ejemplo del método POST
const url_base = 'https://jsonplaceholder.typicode.com';
const dataToSend = {
title: 'foo',
body: 'bar',
userId: 1,
}
const createData = async () => {
const url = url_base + '/posts';
const options = {
method: 'POST',
body: JSON.stringify(dataToSend),
headers: {
'Content-Type': 'application/json'
}
};
const response = await fetch(url, options);
if (!response.ok) {
/* Aquí manejamos el error que devolvió el request HTTP */
console.log('error: ', response.status, response.statusText);
return {error: {status: response.status, statusText: response.statusText}};
};
const data = await response.json();
return data;
};
Ejemplo de una petición con método PUT
const url_base = 'https://jsonplaceholder.typicode.com';
const dataToSend = {
id: 1,
title: 'new foo',
body: 'new bar',
userId: 1,
}
const updateData = async () => {
const url = url_base + '/posts/1';
const options = {
method: 'PUT',
body: JSON.stringify(dataToSend),
headers: {
'Content-Type': 'application/json'
}
};
const response = await fetch(url, options);
if (!response.ok) {
/* Aquí manejamos el error que devolvió el request HTTP */
console.log('error: ', response.status, response.statusText);
return {error: {status: response.status, statusText: response.statusText}};
};
const data = await response.json();
return data;
};
Ejemplo de una petición con el método DELETE
const url_base = 'https://jsonplaceholder.typicode.com';
const deleteData = async () => {
const url = url_base + '/posts/1';
const options = {
method: 'DELETE'
};
const response = await fetch(url, options);
if (!response.ok) {
/* Aquí manejamos el error que devolvió el request HTTP */
console.log('error: ', response.status, response.statusText);
return {error: {status: response.status, statusText: response.statusText}};
};
const data = await response.json();
return data;
};