El método new FormData()
es una función constructora en JavaScript que permite crear un nuevo objeto de tipo FormData. Este objeto es especialmente útil para gestionar datos provenientes de formularios HTML y facilita su construcción y envío al servidor mediante solicitudes AJAX o fetch.
Cuando utilizas new FormData()
, tienes la opción de pasar como argumento una referencia a un elemento de formulario HTML. Si proporcionas un formulario como referencia, el constructor recopila automáticamente todos los campos de entrada del formulario, como campos de texto, casillas de verificación, botones de radio e incluso campos para cargar archivos, y los agrega al objeto FormData
.
Beneficios de usar FormData
El principal beneficio de FormData
radica en su capacidad para simplificar el manejo de datos complejos, especialmente cuando se trabaja con formularios que contienen múltiples campos o archivos.
Además, este objeto se encarga de formatear los datos correctamente como parte del cuerpo de la solicitud HTTP, estableciendo automáticamente los encabezados necesarios para enviar información multipart/form-data al servidor.
En términos prácticos, FormData
es ideal para aplicaciones web modernas que requieren enviar datos de manera dinámica sin necesidad de recargar la página, ofreciendo una solución eficiente y flexible para el manejo de formularios.
Ejemplo sin necesidad de pasar un elemento de formulario
Aquí tienes un ejemplo de cómo crear un objeto FormData
sin necesidad de pasar un elemento de formulario:
const formData = new FormData();
// Agregamos los datos manualmente al objeto FormData
formData.append('nombre', 'John Serrano');
formData.append('edad', 30);
formData.append('archivo', fileInput.files[0]);
// Enviamos el objeto FormData al servidor con fetch
fetch('https://ejemplo.com/api', {
method: 'POST',
body: formData,
})
.then((response) => response.json())
.then((data) => {
console.log('Respuesta del servidor:', data);
})
.catch((error) => {
console.error('Error al enviar los datos:', error);
});
Explicación:
-
Creamos el objeto FormData vacío:
- Se inicializa un nuevo objeto
FormData
sin pasar un formulario como referencia.
- Se inicializa un nuevo objeto
-
Agregamos los datos manualmente:
- Usando el método
append()
, puedes agregar pares clave-valor al objetoFormData
. Por ejemplo:formData.append('nombre', 'John Serrano')
agrega un campo llamado nombre con el valor 'Juan'. También puedes agregar archivos directamente, como en el ejemplo confileInput.files[0]
.
- Usando el método
-
Enviar los datos al servidor:
- La API
fetch
permite enviar el objetoFormData
como el cuerpo de una solicitud POST, y automáticamente configura el encabezadoContent-Type
comomultipart/form-data
.
- La API
Este método es útil cuando necesitas construir los datos dinámicamente sin depender de un formulario HTML.
Ejemplo utilizando un elemento de formulario
Aquí tienes un ejemplo de cómo crear un objeto FormData
utilizando un elemento de formulario HTML:
<form id="miFormulario">
<input type="text" name="nombre" value="John Serrano">
<input type="number" name="edad" value="30">
<input type="file" name="archivo">
</form>
// Seleccionamos el formulario
const formulario = document.getElementById('miFormulario');
// Creamos un objeto FormData a partir del formulario
const formData = new FormData(formulario);
// Enviamos el objeto FormData al servidor con fetch
fetch('https://ejemplo.com/api', {
method: 'POST',
body: formData,
})
.then((response) => response.json())
.then((data) => {
console.log('Respuesta del servidor:', data);
})
.catch((error) => {
console.error('Error al enviar los datos:', error);
});
Explicación:
-
Formulario HTML:
- Definimos un formulario con distintos campos, como texto, números y archivos.
Los atributos
name
de cada campo son esenciales, ya que determinan las claves que se usarán en el objetoFormData
.
- Definimos un formulario con distintos campos, como texto, números y archivos.
Los atributos
-
Creamos el objeto FormData con un formulario:
- Al pasar el elemento
form
como argumento anew FormData(formulario)
, el constructor automáticamente recopila todos los datos de los campos del formulario, incluyendo archivos.
- Al pasar el elemento
-
Enviamos los datos al servidor:
- De forma similar al ejemplo anterior, se utiliza
fetch
para enviar los datos del formulario como una solicitud POST. El navegador se encarga de configurar el encabezadoContent-Type
comomultipart/form-data
.
- De forma similar al ejemplo anterior, se utiliza
Ventaja de este método:
Es ideal cuando ya tienes un formulario HTML definido y quieres enviar todos sus datos sin tener que procesarlos manualmente. Esto simplifica la lógica de manejo de formularios dinámicos en aplicaciones web.
Cómo manipular y serializar los datos enviados desde un formulario
Algunas API no aceptan objetos FormData:
Si examinas los datos devueltos en const formData = new FormData(formulario)
, notarás que la información del formulario no aparece en el objeto de datos recibido.
Esto sucede porque ciertas API, como JSON Placeholder, no trabajan con objetos FormData
. En su lugar, esperan recibir un objeto JSON.
Para convertir un objeto FormData
en un objeto JSON, puedes iterar sobre sus valores utilizando un bucle. Esto se logra recorriendo el objeto FormData
con su método keys()
, que devuelve un iterador de las claves del formulario. Con un bucle for...of
, puedes recorrer cada clave, obtener su valor usando el método get()
, y luego agregarlo a un nuevo objeto JSON.
De esta manera, puedes transformar los datos del formulario para que sean compatibles con API que requieren formato JSON en lugar de FormData
.
const obj = {};
const formData = new FormData(form);
for (var key of formData.keys()) {
obj[key] = formData.get(key);
}
Veamos un ejemplo aplicando una serialización de un objeto FormData
a un formato JSON para poder manipular los datos y enviarlos correctamente a una API que no acepta FormData:
document.addEventListener('submit', function(event) {
event.preventDefault();
const form = event.target
const formData = new FormData(form)
console.log(formData)
const dataJSON = {};
for (var key of formData.keys()) {
obj[key] = formData.get(key);
}
console.log(dataJSON)
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(dataJSON)
}).then(function(response) {
if (response.ok) {
return response.json();
}
return Promise.reject(response);
}).then(function(data) {
console.log(data);
}).catch(function(error) {
console.warn(error);
});
});
Explicación del código:
-
Crear el objeto FormData:
- Se genera a partir del formulario para recopilar automáticamente todos los datos del mismo.
-
Iterar sobre FormData y serializar:
- Usamos el método
keys()
para obtener las claves de cada campo del formulario. Con un buclefor...of
, iteramos sobre cada clave y utilizamos el métodoget()
para obtener su valor. Cada par clave-valor se agrega al objeto dataJSON.
- Usamos el método
-
Enviar los datos serializados:
- Se convierte el objeto
dataJSON
en una cadena JSON conJSON.stringify()
. La solicitud se configura con el encabezadoContent-Type: application/json
para que la API sepa que está recibiendo datos en formato JSON.
- Se convierte el objeto
Una alternativa más sencilla usando el método Object.fromEntries()
Object.fromEntries(new FormData(event.target));
Ejemplo:
document.addEventListener('submit', function(event) {
event.preventDefault();
const form = event.target
const data = Object.fromEntries(new FormData(form))
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-type': 'application/json;'
},
body: JSON.stringify(data)
}).then(function(response) {
if (response.ok) {
return response.json();
}
return Promise.reject(response);
}).then(function(data) {
console.log(data);
}).catch(function(error) {
console.warn(error);
});
});
Otra forma también de aplicar el método Object.fromEntries()
sería así:
const formData = new FormData(form)
const data = Object.fromEntries(formData.entries())
Te dejo un carrusel donde te explico las diferentes formas de trabajar con el new FormData()
, Objeto FormData() transformando los datos de un formulario con vanilla JS 🔥.
Finalmente un ejemplo aplicándolo a React
const formRef = useRef(null)
const handleSubmit = (e) => {
e.preventDefault()
const form = e.currentTarget
const formData = new FormData(form)
const data = Object.fromEntries(formData.entries())
console.log(data)
formRef.current ? .reset()
}
Conclusión
En resumen, new FormData()
es una herramienta poderosa en JavaScript para manejar datos de formularios de manera sencilla. Permite capturar todos los campos de un formulario, incluidos archivos, y enviarlos fácilmente a un servidor.
Aunque no todos los endpoints
aceptan objetos FormData
, puedes convertirlos a otros formatos como JSON si es necesario. Usar FormData
mejora la flexibilidad y la eficiencia en el manejo de formularios, especialmente cuando trabajas con AJAX o solicitudes fetch.
Te invito a visitar mi blog, donde encontrarás más contenido interesante y útil como este. ¡No te lo pierdas! 🚀 Gracias por leer.
Top comments (0)