Próbuję opublikować obiekt JSON przy użyciu funkcji pobierania .
Z tego, co rozumiem, muszę dołączyć obiekt strunowy do treści żądania, np .:
fetch("/echo/json/",
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
body: JSON.stringify({a: 1, b: 2})
})
.then(function(res){ console.log(res) })
.catch(function(res){ console.log(res) })
Podczas korzystania z echa jsfiddle'a jsfiddle spodziewałbym się zobaczyć obiekt, który wysłałem ( {a: 1, b: 2}
) z powrotem, ale tak się nie dzieje - chrome devtools nawet nie pokazują JSON jako części żądania, co oznacza, że nie jest wysyłany.
javascript
json
fetch-api
Brzytwa
źródło
źródło
{}
res.json()
powinien wrócić{a: 1, b: 2}
.json
właściwość zawierającą dane, które chcesz wysłać. Jednak i takbody
nie jest traktowany poprawnie. Zobacz to skrzypce, aby zobaczyć, że opóźnienie 5 sekund zostanie pominięte. jsfiddle.net/99arsnkg Również przy próbie dodania dodatkowych nagłówków są one ignorowane. Jest to prawdopodobnie problemfetch()
sam w sobie.Odpowiedzi:
Z ES2017
async/await
wsparcia , to jakPOST
ładowności JSON:Nie możesz użyć ES2017? Zobacz odpowiedź @ vp_art za pomocą obietnic
Pytanie dotyczy jednak problemu spowodowanego przez dawno naprawiony błąd chrome.
Oryginalna odpowiedź następuje.
To jest prawdziwy problem i jest to błąd w chrome devtools , naprawiony w Chrome 46.
Ten kod działa dobrze - poprawnie umieszcza JSON, po prostu nie można go zobaczyć.
to nie działa, ponieważ nie jest to poprawny format echa JSfiddle .
Poprawny kod jest:
W przypadku punktów końcowych przyjmujących ładunki JSON oryginalny kod jest poprawny
źródło
x-www-form-urlencoded
) z danymi JSON w polu o nazwiejson
. Dane są więc podwójnie kodowane. Aby uzyskać czysty post JSON, zobacz odpowiedź autorstwa @vp_arth poniżej.res.ok
w przypadku błędu w kodzie odpowiedzi. Dobrze byłoby też mieć.catch()
klauzulę na końcu. Zdaję sobie sprawę, że to tylko fragment próbny, ale pamiętaj o tych rzeczach do użytku w świecie rzeczywistym.Myślę, że Twój problem dotyczy
jsfiddle
tylko przetwarzaniaform-urlencoded
wniosków.Ale poprawnym sposobem na przesłanie żądania json jest podanie poprawne
json
jako treści:źródło
x-www-form-urlencoded
vsapplication/json
, albo nie pasując do nich, albo podwójnie owijając JSON ciągami kodowanymi w adresie URL./echo
?Z wyszukiwarek skończyłem na tym temacie, że publikowanie danych spoza JSON z funkcją pobierania, więc pomyślałem, że mogę to dodać.
W przypadku non-json nie musisz używać danych formularza. Możesz po prostu ustawić
Content-Type
nagłówekapplication/x-www-form-urlencoded
i użyć ciągu:Alternatywnym sposobem na zbudowanie tego
body
ciągu, zamiast wpisywania go tak, jak to zrobiłem powyżej, jest użycie bibliotek. Na przykładstringify
funkcja zquery-string
lubqs
pakiety. Używając tego, wyglądałoby to tak:źródło
Po spędzeniu kilku chwil, inżynieria wsteczna jsFiddle, próba wygenerowania ładunku - jest efekt.
Proszę zwrócić uwagę (ostrożność) na linię,
return response.json();
gdzie reakcja nie jest odpowiedzią - jest obietnicą.jsFiddle: http://jsfiddle.net/egxt6cpz/46/ && Firefox> 39 i& Chrome> 42
źródło
'x-www-form-urlencoded
zamiast tegoapplication/json
? Co za różnica?application/json
jest to poprawna forma i działa teraz. Dzięki za dobre okofetch
( stackoverflow.com/questions/41984893/... ) zamiastapplication/json
. Być może wiesz, dlaczego ...Content-Type
jestapplication/json
, alebody
wydaje się, że tak jestx-www-form-urlencoded
- nie sądzę, że to powinno działać? Jeśli to działa, twój serwer musi być bardzo wyrozumiały. Odpowiedź @vp_arth poniżej wydaje się być poprawna.Utworzyłem cienkie opakowanie wokół funkcji fetch () z wieloma ulepszeniami, jeśli używasz czysto json API REST:
Aby go użyć, masz zmienną
api
i 4 metody:I w ramach
async
funkcji:Przykład z jQuery:
źródło
Object.assign
? powinno byćObject.assign({}, api.headers, headers)
tak, ponieważ nie chcesz ciągle dodawać niestandardowych wartościheaders
do mieszania wspólnegoapi.headers
. dobrze?Jest to związane z
Content-Type
. Jak można zauważyć z innych dyskusji i odpowiedzi na to pytanie, niektórzy ludzie byli w stanie rozwiązać to przez ustawienieContent-Type: 'application/json'
. Niestety w moim przypadku nie zadziałało, moje żądanie POST było nadal puste po stronie serwera.Jeśli jednak spróbujesz użyć jQuery's
$.post()
i działa, przyczyną jest prawdopodobnie użycie jQueryContent-Type: 'x-www-form-urlencoded'
zamiastapplication/json
.źródło
Miał ten sam problem - nie
body
został wysłany z klienta na serwer.Dodanie
Content-Type
nagłówka rozwiązało to dla mnie:źródło
Najlepsza odpowiedź nie działa dla PHP7, ponieważ ma złe kodowanie, ale mógłbym znaleźć właściwe kodowanie z innymi odpowiedziami. Ten kod wysyła również uwierzytelniające pliki cookie, które prawdopodobnie chcesz mieć do czynienia np. Z forami PHP:
źródło
Może to być przydatne dla kogoś:
Miałem problem, że formdata nie została wysłana dla mojej prośby
W moim przypadku przyczyną problemu był niewłaściwy typ treści i kombinacja następujących nagłówków.
Wysłałem więc te dwa nagłówki z żądaniem i nie wysyłałem danych formd, kiedy usunąłem działające nagłówki.
Również inne odpowiedzi sugerują, że nagłówek Content-Type musi być poprawny.
Dla mojego żądania poprawny nagłówek Content-Type to:
Tak więc, jeśli twoje dane formalne nie są dołączane do żądania, mogą to być twoje nagłówki. Spróbuj ograniczyć nagłówki do minimum, a następnie spróbuj dodawać je jeden po drugim, aby sprawdzić, czy problem został rozwiązany.
źródło
Myślę, że nie potrzebujemy parsować obiektu JSON w ciąg, jeśli zdalny serwer akceptuje json w żądaniu, wystarczy uruchomić:
Takich jak żądanie zwijania
Jeśli zdalny serwer nie zaakceptuje pliku json jako treści, po prostu wyślij formularz danych:
Takich jak żądanie zwijania
źródło
curl
polecenie! Jeśli nie skreślisz swoich obiektów przed przekazaniem ich jako tychbody
, które wyślesz"[object Object]"
jako treść żądania. Pokazałby to prosty test w Dev Tools. Otwórz i wypróbuj to, nie opuszczając tej zakładki:a = new FormData(); a.append("foo","bar"); fetch("/foo/bar", { method: 'POST', body: {}, headers: { 'Content-type': 'application/json' } })
Jeśli twój ładunek JSON zawiera tablice i zagnieżdżone obiekty,
URLSearchParams
użyłbymparam()
metody jQuery .Się z serwerem, będzie to wyglądać jak standardowy HTML
<form>
samopoczuciaPOST
ed.źródło