La POST
solicitud de axios está llegando a la url en el controlador pero estableciendo valores nulos para mi clase POJO, cuando reviso las herramientas de desarrollador en Chrome, la carga útil contiene datos. ¿Qué estoy haciendo mal?
Solicitud POST de Axios:
var body = {
userName: 'Fred',
userEmail: '[email protected]'
}
axios({
method: 'post',
url: '/addUser',
data: body
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Respuesta del navegador:
Si configuro encabezados como:
headers:{
Content-Type:'multipart/form-data'
}
La solicitud arroja el error
Error al publicar datos multiparte / formulario. Al encabezado de tipo de contenido le falta el límite
Si hago la misma solicitud en cartero, está funcionando bien y establece valores para mi clase POJO.
¿Alguien puede explicar cómo establecer límites o cómo puedo enviar datos de formulario usando axios?
fuente
set
no funciona{ method: 'post', url: 'myurl', data: bodyFormData, headers: {'Content-Type': 'multipart/form-data' } }
Echa un vistazo a la cadena de consulta .
Puede usarlo de la siguiente manera:
fuente
En mi caso, tuve que agregar el límite al encabezado de la siguiente manera:
Esta solución también es útil si está trabajando con React Native.
fuente
FormData._boundary
no está definido tanto en Chrome 76 como en Firefox 67, y axios elimina el encabezado Content-Type de todos modos , por lo que esto no debería tener ningún efecto.Subir (múltiples) archivos binarios
Node.js
Las cosas se complican cuando quieres publicar archivos a través de
multipart/form-data
, especialmente múltiples archivos binarios. A continuación se muestra un ejemplo de trabajo:headers: {'Content-Type': 'multipart/form-data' }
prefieroheaders: formData.getHeaders()
async
y másawait
arriba, puede cambiarlos a declaraciones simples de Promesa si no le gustanContenido recientemente agregado a continuación:
Navegador
El navegador
FormData
es diferente del paquete NPM 'form-data'. El siguiente código me funciona en el navegador:HTML:
JavaScript:
fuente
concat-stream
,async
yawait
) para la carga de archivos múltiples utilizandofor(var x = 0; x<this.state.files.length; x++) { formData.append('files[]', this.state.files[x]) }
para que pueda presentar utilizandoaxios.post(url, formData, config)
Aún más directo:
fuente
Uso del formato application / x-www-form-urlencoded en axios
Navegador
En un navegador, puede usar la API URLSearchParams de la siguiente manera:
Tenga en cuenta que URLSearchParams no es compatible con todos los navegadores (consulte caniuse.com), pero hay un polyfill disponible (asegúrese de polyfill el entorno global).
Alternativamente, puede codificar datos usando la biblioteca qs:
O de otra manera (ES6),
fuente
2020 ES6 forma de hacer
Teniendo el formulario en html, vinculé datos como este:
DATOS:
onSubmit:
fuente
El método anterior funcionó para mí, pero como era algo que necesitaba con frecuencia, utilicé un método básico para objetos planos. Tenga en cuenta que también estaba usando Vue y no REACT
Lo que funcionó para mí hasta que me encontré con estructuras de datos más complejas con objetos anidados y archivos que luego permitieron lo siguiente
fuente
objectToFormData
apackageData
o viceversafuente