Mój kod:
fetch("api/xxx", {
body: new FormData(document.getElementById("form")),
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// "Content-Type": "multipart/form-data",
},
method: "post",
}
Próbowałem opublikować swój formularz za pomocą api pobierania, a treść, którą wysyła, wygląda następująco:
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(Nie wiem, dlaczego liczba w granicach jest zmieniana za każdym razem, gdy wysyła ...)
Chciałbym, aby wysyłał dane z "Content-Type": "application / x-www-form-urlencoded", co mam zrobić? A jeśli po prostu muszę sobie z tym poradzić, jak zdekodować dane w kontrolerze?
Komu odpowiadam na moje pytanie, wiem, że mogę to zrobić:
fetch("api/xxx", {
body: "[email protected]&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
To, czego chcę, to coś takiego jak $ ("# form"). Serialize () w jQuery (bez użycia jQuery) lub sposób na dekodowanie danych mulitpart / form w kontrolerze. Dziękuję jednak za odpowiedzi.
javascript
ajax
fetch-api
Zack
źródło
źródło
FormData
?Odpowiedzi:
Cytując MDN
FormData
(moje podkreślenie):Więc kiedy używasz
FormData
, zamykasz się wmultipart/form-data
. Nie ma możliwości wysłaniaFormData
obiektu jako treści i nie wysyłania danych wmultipart/form-data
formacie.Jeśli chcesz wysłać dane
application/x-www-form-urlencoded
, musisz określić treść jako ciąg zakodowany w adresie URL lub przekazaćURLSearchParams
obiekt. Tego ostatniego niestety nie można bezpośrednio zainicjować zform
elementu. Jeśli nie chcesz iterację swoimi elementów formularzy siebie (co mogłoby zrobić przy użyciuHTMLFormElement.elements
), można również utworzyćURLSearchParams
obiekt zFormData
przedmiotu:Pamiętaj, że nie musisz samodzielnie określać
Content-Type
nagłówka.Jak zauważył monk-time w komentarzach, możesz również utworzyć
URLSearchParams
i przekazaćFormData
obiekt bezpośrednio, zamiast dołączać wartości w pętli:To wciąż ma pewne eksperymentalne wsparcie w przeglądarkach, więc upewnij się, że przetestujesz to poprawnie przed użyciem.
źródło
FormData
w konstruktorze zamiast pętli:new URLSearchParams(new FormData(formElement))
URLSearchParams
był bardzo nowy i miał bardzo ograniczone poparcie.fetch
zająć się tym za siebie.URLSearchParams
jest wbudowane w większość nowoczesnych przeglądarek jako obiekt globalny i działa również w środowisku Node.Klient
Nie ustawiaj nagłówka typu zawartości.
serwer
Użyj
FromForm
atrybutu, aby określić, że źródłem powiązania są dane formularza.źródło
application/x-www-form-urlencoded
które prosi OP.Content-Type
z nagłówka i pozwoliłem przeglądarce zrobić to automatycznie. Dzięki!multipart/form-data
, co powinno być dla danych formularza! Następnie możesz użyćmulter
w expressjs do łatwej analizy tego formatu danych.Możesz ustawić
body
na wystąpienieURLSearchParams
z ciągiem zapytania przekazanym jako argumentźródło
Reflect.apply(params.set, params, props)
jest szczególnie nieczytelnym sposobem powiedzeniaparams.set(props[0], props[1])
.Reflect.apply(params.set, params, props)
można odczytać z perspektywy tutaj.Użyj
FormData
i,fetch
aby pobrać i wysłać danePokaż fragment kodu
źródło
źródło