JavaScript
Web APIs
HTTP
Fetch
then
/ catch
Con then
configuramos una función que trata la respuesta, y con catch
configuramos otra función que tratará posibles errores durante la recepción de la misma:
fetch('URL', {
method: 'POST',
mode: 'cors',
headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},
body: JSON.stringify({cuerpo: 'peticion'})
}).then(respuesta => {
if (respuesta.ok) {
return respuesta.json();
} else {
throw respuesta.status;
}
}).then(json => {
console.log('Respuesta OK:', json);
// A continuación viene código que usa objeto del json ...
}).catch(error => {
console.error('Error inexperado:', error);
// A continuación viene código que trata el error ...
});
<body> <div class="card"> <div class="card-header">Mensajes</div> <div class="card-body row"> <div class="col text-center"> <h5 id="titulo" class="card-title">No tienes mensajes</h5> <p id="mensaje" class="card-text"><i class="bi bi-chat" style="font-size: 4rem; color:gray;"></i></p> <button id="boton" type="button" class="btn btn-primary" onclick="actualizar()">Actualizar</button> </div> </div> <div id="estado" class="card-footer text-muted">Sin actualizar</div> </div> </body>
const peticion = function() { fetch('https://httpstat.us/200?' + new URLSearchParams({sleep: 4000}), { method: 'GET', mode: 'cors', headers: {'Accept': 'application/json', 'Content-Type': 'application/json'} }).then(respuesta => { if (respuesta.ok) { return respuesta.json(); } else { throw respuesta.status; } }).then(objeto => { mostrarMensajes(objeto); }).catch(error => { mostrarError(error); }); } // Lógica para cambiar la interfaz de usuario en función // de la respuesta recibida: const boton = document.getElementById('boton'); const estado = document.getElementById('estado'); const mostrarMensajes = function(mensajes) { cambiaEstadoBoton('enabled'); estado.textContent = `0 mensajes - Actualizado a las ${new Date().toLocaleTimeString()}`; } const mostrarError = function(error) { cambiaEstadoBoton('enabled'); estado.innerHTML = `<i class="bi bi-exclamation-triangle-fill"></i> Error al actualizar (${error})`; } const mostrarActualizando = function() { cambiaEstadoBoton('disabled'); estado.innerHTML = '<div class="spinner-border spinner-border-sm"></div> Actualizando...'; } const cambiaEstadoBoton = function(estado) { boton.disabled = estado === 'disabled'; } const actualizar = function() { mostrarActualizando(); peticion(); }
html { font-size: 75%; padding: 2rem; }
❓ Pregunta: ¿Para qué crees que vale el
URLSearchParams
de la query de la URL? ¿Y las cabeceras HTTP? (pista).
❓ Ejercicio: Añade trazas al código anterior para ver qué se ejecuta cuando la URL de la petición es:
https://httpstat.us/500
https://invalid.us/