Meu 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",
}
Tentei postar meu formulário usando fetch api, e o corpo que ele envia é assim:
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(Não sei por que o número no limite é alterado toda vez que ele envia ...)
Desejo enviar os dados com "Content-Type": "application / x-www-form-urlencoded", o que devo fazer? Ou se eu apenas tenho que lidar com isso, como decodifico os dados no meu controlador?
Para quem responde à minha pergunta, eu sei que posso fazer isso com:
fetch("api/xxx", {
body: "[email protected]&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
O que eu quero é algo como $ ("# form"). Serialize () em jQuery (sem usar jQuery) ou a forma de decodificar mulitpart / form-data no controlador. Obrigado por suas respostas.
javascript
ajax
fetch-api
Zack
fonte
fonte
FormData
?Respostas:
Para citar MDN em
FormData
(grifo meu):Portanto, ao usar
FormData
você está se bloqueandomultipart/form-data
. Não há como enviar umFormData
objeto como corpo e não enviar dados nomultipart/form-data
formato.Se você quiser enviar os dados como
application/x-www-form-urlencoded
você terá que especificar o corpo como uma string codificada por URL ou passar umURLSearchParams
objeto. O último infelizmente não pode ser inicializado diretamente de umform
elemento. Se você não quiser iterar por meio dos elementos do formulário (o que pode ser feito usandoHTMLFormElement.elements
), também pode criar umURLSearchParams
objeto a partir de umFormData
objeto:Observe que você não precisa especificar um
Content-Type
cabeçalho.Conforme observado por monk-time nos comentários, você também pode criar
URLSearchParams
e passar oFormData
objeto diretamente, em vez de anexar os valores em um loop:Ele ainda tem algum suporte experimental em navegadores, então certifique-se de testar isso corretamente antes de usá-lo.
fonte
FormData
no construtor diretamente em vez de um loop:new URLSearchParams(new FormData(formElement))
URLSearchParams
era muito novo e tinha suporte muito limitado.fetch
cuidar disso para você.URLSearchParams
é integrado à maioria dos navegadores modernos como um objeto global e também funciona a partir do Node.Cliente
Não defina o cabeçalho do tipo de conteúdo.
Servidor
Use o
FromForm
atributo para especificar que a origem da ligação são os dados do formulário.fonte
application/x-www-form-urlencoded
é o que o OP está pedindo.Content-Type
do cabeçalho e deixava o navegador fazer isso automaticamente. Obrigado!multipart/form-data
, que é o que deveria ser para dados de formulário! Depois, você pode usar omulter
in expressjs para analisar esse formato de dados facilmente.Você pode definir
body
como uma instância deURLSearchParams
com string de consulta passada como argumentofonte
Reflect.apply(params.set, params, props)
é uma forma particularmente ilegível de dizerparams.set(props[0], props[1])
.Reflect.apply(params.set, params, props)
ser lido da perspectiva aqui.Use
FormData
efetch
para pegar e enviar dadosExibir trecho de código
fonte
fonte