Saya mencoba POST objek JSON menggunakan fetch .
Dari apa yang bisa saya mengerti, saya perlu melampirkan objek yang dirender ke badan permintaan, misalnya:
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) })
Saat menggunakan gema jsfiddle's json, saya berharap melihat objek yang telah saya kirim ( {a: 1, b: 2}
) kembali, tetapi ini tidak terjadi - chrome devtools bahkan tidak menampilkan JSON sebagai bagian dari permintaan, yang berarti bahwa itu tidak dikirim.
javascript
json
fetch-api
Pisau cukur
sumber
sumber
{}
res.json()
harus kembali{a: 1, b: 2}
.json
properti yang berisi data yang ingin Anda kirim. Namun, sayabody
tidak diperlakukan dengan benar pula. Lihat biola ini untuk melihat bahwa keterlambatan 5 detik akan dilewati. jsfiddle.net/99arsnkg Juga, ketika Anda mencoba menambahkan header tambahan, mereka diabaikan. Ini mungkin masalah denganfetch()
dirinya sendiri.Jawaban:
Dengan
async/await
dukungan ES2017 , ini adalah cara pembayaranPOST
JSON:Tidak dapat menggunakan ES2017? Lihat jawaban @ vp_art menggunakan janji
Namun pertanyaannya adalah menanyakan masalah yang disebabkan oleh bug chrome yang telah diperbaiki sejak lama.
Jawaban asli berikut.
Ini adalah masalah sebenarnya di sini , dan ini adalah bug dengan devtools krom , diperbaiki di Chrome 46.
Kode itu berfungsi dengan baik - itu POSTING JSON dengan benar, itu tidak bisa dilihat.
itu tidak berfungsi karena itu bukan format yang benar untuk gema JSfiddle .
The kode yang benar adalah:
Untuk titik akhir menerima muatan JSON, kode asli sudah benar
sumber
x-www-form-urlencoded
) dengan data JSON dalam bidang bernamajson
. Jadi data dikodekan ganda. Untuk posting JSON yang bersih, lihat jawaban oleh @vp_arth di bawah ini.res.ok
jika kode respons adalah semacam kesalahan. Itu juga bagus untuk memiliki.catch()
klausa di akhir. Saya menyadari ini hanya cuplikan contoh, tetapi ingatlah hal-hal ini untuk penggunaan dunia nyata.Saya pikir masalah Anda hanya
jsfiddle
dapat memprosesform-urlencoded
permintaan.Tetapi cara yang benar untuk membuat permintaan json dilewati dengan benar
json
sebagai sebuah badan:sumber
x-www-form-urlencoded
vsapplication/json
, baik ketidakcocokan mereka atau JSON pembungkus ganda dalam string yang disandikan dengan url./echo
rute jsfiddle ?Dari mesin pencari, saya berakhir pada topik ini untuk data posting non-json dengan mengambil, jadi saya pikir saya akan menambahkan ini.
Untuk non-json, Anda tidak harus menggunakan data formulir. Anda cukup mengatur
Content-Type
tajukapplication/x-www-form-urlencoded
dan menggunakan string:Cara alternatif untuk membangun
body
string itu, daripada mengetiknya seperti yang saya lakukan di atas, adalah dengan menggunakan perpustakaan. Misalnyastringify
fungsi dariquery-string
atauqs
paket. Jadi menggunakan ini akan terlihat seperti:sumber
Setelah menghabiskan beberapa waktu, balikkan jsFiddle, mencoba menghasilkan payload - ada efeknya.
Tolong tatap mata (hati-hati) pada saluran di
return response.json();
mana respons bukanlah respons - itu adalah janji.jsFiddle: http://jsfiddle.net/egxt6cpz/46/ && Firefox> 39 && Chrome> 42
sumber
'x-www-form-urlencoded
sebaliknyaapplication/json
? Apa bedanya?application/json
bentuk yang benar dan berfungsi sekarang. Terima kasih untuk mata yang baikfetch
( stackoverflow.com/questions/41984893/… ) sebagai gantinyaapplication/json
. Mungkin Anda tahu mengapa ...Content-Type
adalahapplication/json
, tetapi Anda sebenarnyabody
muncul untuk menjadix-www-form-urlencoded
- saya tidak berpikir ini harus bekerja? Jika berhasil, server Anda pasti cukup pemaaf. Jawaban oleh @vp_arth di bawah ini kelihatannya benar.Saya telah membuat pembungkus tipis sekitar fetch () dengan banyak perbaikan jika Anda menggunakan API SISA murni json:
Untuk menggunakannya, Anda memiliki variabel
api
dan 4 metode:Dan dalam suatu
async
fungsi:Contoh dengan jQuery:
sumber
Object.assign
? seharusnyaObject.assign({}, api.headers, headers)
karena Anda tidak ingin terus menambahkan kustomheaders
ke dalam hash yang umumapi.headers
. Baik?Ini terkait dengan
Content-Type
. Seperti yang mungkin telah Anda perhatikan dari diskusi lain dan jawaban untuk pertanyaan ini beberapa orang dapat menyelesaikannya dengan menetapkanContent-Type: 'application/json'
. Sayangnya dalam kasus saya itu tidak berfungsi, permintaan POST saya masih kosong di sisi server.Namun, jika Anda mencoba dengan jQuery
$.post()
dan berfungsi, alasannya mungkin karena jQuery menggunakanContent-Type: 'x-www-form-urlencoded'
alih-alihapplication/json
.sumber
Punya masalah yang sama - tidak ada
body
yang dikirim dari klien ke server.Menambahkan
Content-Type
header menyelesaikannya untuk saya:sumber
Jawaban teratas tidak berfungsi untuk PHP7, karena memiliki penyandian yang salah, tetapi saya dapat menemukan penyandian yang tepat dengan jawaban lainnya. Kode ini juga mengirimkan cookie otentikasi, yang mungkin Anda inginkan ketika berhadapan dengan misalnya forum PHP:
sumber
Mungkin bermanfaat bagi seseorang:
Saya mengalami masalah bahwa formdata tidak dikirim untuk permintaan saya
Dalam kasus saya, kombinasi header berikut yang juga menyebabkan masalah dan Tipe Konten yang salah.
Jadi saya mengirim dua header ini dengan permintaan dan itu tidak mengirim formata ketika saya menghapus header yang berfungsi.
Juga sebagai jawaban lain menyarankan bahwa header Tipe Konten perlu benar.
Untuk permintaan saya, header Jenis Konten yang benar adalah:
Jadi intinya jika formdata Anda tidak dilampirkan pada Permintaan maka itu berpotensi menjadi tajuk Anda. Coba bawa tajuk Anda seminimal mungkin dan kemudian coba tambahkan satu per satu untuk melihat apakah masalah Anda teratasi.
sumber
Saya berpikir bahwa, kita tidak perlu mengurai objek JSON menjadi sebuah string, jika server jauh menerima json ke dalam permintaan mereka, jalankan saja:
Seperti permintaan ikal
Dalam hal untuk melayani jarak jauh tidak menerima file json sebagai badan, cukup kirim dataForm:
Seperti permintaan ikal
sumber
curl
perintah Anda secara implisit! Jika Anda tidak menjernihkan objek Anda sebelum meneruskannya karenabody
Anda hanya akan mengirim"[object Object]"
sebagai badan permintaan Anda. Tes sederhana di Dev Tools akan menunjukkan kepada Anda hal itu. Buka dan coba ini tanpa meninggalkan tab ini:a = new FormData(); a.append("foo","bar"); fetch("/foo/bar", { method: 'POST', body: {}, headers: { 'Content-type': 'application/json' } })
Jika muatan JSON Anda berisi array dan objek bersarang, saya akan menggunakan
URLSearchParams
danparam()
metode jQuery .Untuk server Anda, ini akan terlihat seperti HTML standar yang
<form>
sedangPOST
diedit.sumber