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,
FormDatate estás encerrando enmultipart/form-data. No hay forma de enviar unFormDataobjeto como cuerpo y no enviar datos en elmultipart/form-dataformato.Si desea enviar los datos,
application/x-www-form-urlencodedtendrá que especificar el cuerpo como una cadena codificada en URL o pasar unURLSearchParamsobjeto. Desafortunadamente, este último no se puede inicializar directamente desde unformelemento. 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 unURLSearchParamsobjeto a partir de unFormDataobjeto:Tenga en cuenta que no es necesario que especifique un
Content-Typeencabezado usted mismo.Como señaló monk-time en los comentarios, también puede crear
URLSearchParamsy pasar elFormDataobjeto 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
FormDataen el constructor directamente en lugar de un bucle:new URLSearchParams(new FormData(formElement))URLSearchParamsera muy nuevo y tenía un soporte muy limitado.fetchencargarse de él por usted.URLSearchParamsestá 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
FromFormatributo para especificar que la fuente de enlace son datos de formulario.fuente
application/x-www-form-urlencodedque es lo que solicita OP.Content-Typedel 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 usarmulteren expressjs para analizar ese formato de datos fácilmente.Puede establecer
bodyuna instancia deURLSearchParamscon 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
FormDatayfetchpara capturar y enviar datosMostrar fragmento de código
fuente
fuente