Mi código:
fetch("api/xxx", {
body: new FormData(document.getElementById("form")),
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// "Content-Type": "multipart/form-data",
},
method: "post",
}
Intenté publicar mi formulario usando fetch api, y el cuerpo que envía es como:
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(No sé por qué se cambia el número en el límite cada vez que envía ...)
Me gustaría que envíe los datos con "Content-Type": "application / x-www-form-urlencoded", ¿qué debo hacer? O si solo tengo que lidiar con eso, ¿cómo decodifico los datos en mi controlador?
A quien responda mi pregunta, sé que puedo hacerlo con:
fetch("api/xxx", {
body: "[email protected]&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
Lo que quiero es algo como $ ("# formulario"). Serialize () en jQuery (sin usar jQuery) o la forma de decodificar mulitpart / form-data en el controlador. Sin embargo, gracias por tus respuestas.
javascript
ajax
fetch-api
Zack
fuente
fuente
FormData
?Respuestas:
Para citar MDN en
FormData
(el énfasis es mío):Entonces, cuando lo usas,
FormData
te estás encerrando enmultipart/form-data
. No hay forma de enviar unFormData
objeto como cuerpo y no enviar datos en elmultipart/form-data
formato.Si desea enviar los datos,
application/x-www-form-urlencoded
tendrá que especificar el cuerpo como una cadena codificada en URL o pasar unURLSearchParams
objeto. Desafortunadamente, este último no se puede inicializar directamente desde unform
elemento. Si no desea iterar a través de los elementos de su formulario usted mismo (lo que podría hacer usandoHTMLFormElement.elements
), también puede crear unURLSearchParams
objeto a partir de unFormData
objeto:Tenga en cuenta que no es necesario que especifique un
Content-Type
encabezado usted mismo.Como señaló monk-time en los comentarios, también puede crear
URLSearchParams
y pasar elFormData
objeto directamente, en lugar de agregar los valores en un bucle:Sin embargo, esto todavía tiene cierto soporte experimental en los navegadores, así que asegúrese de probarlo correctamente antes de usarlo.
fuente
FormData
en el constructor directamente en lugar de un bucle:new URLSearchParams(new FormData(formElement))
URLSearchParams
era muy nuevo y tenía un soporte muy limitado.fetch
encargarse de él por usted.URLSearchParams
está integrado en la mayoría de los navegadores modernos como un objeto global y también funciona desde Node.Cliente
No establezca el encabezado de tipo de contenido.
Servidor
Utilice el
FromForm
atributo para especificar que la fuente de enlace son datos de formulario.fuente
application/x-www-form-urlencoded
que es lo que solicita OP.Content-Type
del encabezado y dejé que el navegador lo hiciera automáticamente. ¡Gracias!multipart/form-data
, que es lo que debería ser para los datos del formulario. Luego, puede usarmulter
en expressjs para analizar ese formato de datos fácilmente.Puede establecer
body
una instancia deURLSearchParams
con una cadena de consulta pasada como argumentofuente
Reflect.apply(params.set, params, props)
es una forma de decir particularmente ilegibleparams.set(props[0], props[1])
.Reflect.apply(params.set, params, props)
se puede leer desde la perspectiva aquí.Utilice
FormData
yfetch
para capturar y enviar datosMostrar fragmento de código
fuente
fuente