Kode saya:
fetch("api/xxx", {
body: new FormData(document.getElementById("form")),
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// "Content-Type": "multipart/form-data",
},
method: "post",
}
Saya mencoba memposting formulir saya menggunakan fetch api, dan tubuh yang dikirimnya seperti:
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(Saya tidak tahu mengapa nomor dalam batas berubah setiap kali dikirim ...)
Saya ingin mengirim data dengan "Content-Type": "application / x-www-form-urlencoded", apa yang harus saya lakukan? Atau jika saya hanya harus mengatasinya, bagaimana cara memecahkan kode data di pengontrol saya?
Kepada siapa menjawab pertanyaan saya, saya tahu saya bisa melakukannya dengan:
fetch("api/xxx", {
body: "[email protected]&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
Yang saya inginkan adalah sesuatu seperti $ ("# form"). Serialize () di jQuery (tanpa menggunakan jQuery) atau cara untuk memecahkan kode mulitpart / form-data di controller. Terima kasih atas jawaban Anda.
javascript
ajax
fetch-api
Zack
sumber
sumber
FormData
?Jawaban:
Mengutip MDN pada
FormData
(penekanan saya):Jadi saat menggunakan
FormData
Anda mengunci diri Anda ke dalammultipart/form-data
. Tidak ada cara untuk mengirimFormData
objek sebagai badan dan tidak mengirimkan data dalammultipart/form-data
format.Jika Anda ingin mengirim data karena
application/x-www-form-urlencoded
Anda harus menentukan isi sebagai string yang dienkode URL, atau meneruskanURLSearchParams
objek. Sayangnya yang terakhir tidak dapat langsung diinisialisasi dari sebuahform
elemen. Jika Anda tidak ingin mengulang sendiri elemen formulir Anda (yang dapat Anda lakukan menggunakanHTMLFormElement.elements
), Anda juga dapat membuatURLSearchParams
objek dariFormData
objek:Perhatikan bahwa Anda tidak perlu menentukan
Content-Type
tajuk sendiri.Seperti yang dicatat oleh monk-time di komentar, Anda juga bisa membuat
URLSearchParams
dan meneruskanFormData
objek secara langsung, daripada menambahkan nilai dalam satu putaran:Ini masih memiliki beberapa dukungan eksperimental di browser, jadi pastikan untuk menguji ini dengan benar sebelum Anda menggunakannya.
sumber
FormData
di konstruktor secara langsung daripada loop:new URLSearchParams(new FormData(formElement))
URLSearchParams
masih sangat baru dan memiliki dukungan yang sangat terbatas.fetch
mengurusnya untuk Anda.URLSearchParams
dibangun di sebagian besar browser modern sebagai objek global dan juga berfungsi dari Node.Klien
Jangan setel header tipe konten.
Server
Gunakan
FromForm
atribut untuk menentukan bahwa sumber pengikatan adalah data formulir.sumber
application/x-www-form-urlencoded
yang diminta OP.Content-Type
dari header dan membiarkan browser melakukannya secara otomatis. Terima kasih!multipart/form-data
, seperti yang seharusnya untuk data formulir! Kemudian Anda dapat menggunakanmulter
expressjs untuk mengurai format data tersebut dengan mudah.Anda dapat menyetel
body
ke instanceURLSearchParams
dengan string kueri yang diteruskan sebagai argumensumber
Reflect.apply(params.set, params, props)
adalah cara mengucapkan yang sangat tidak terbacaparams.set(props[0], props[1])
.Reflect.apply(params.set, params, props)
dapat dibaca dari perspektif di sini.Gunakan
FormData
danfetch
untuk mengambil dan mengirim dataTampilkan cuplikan kode
sumber
sumber