Kirim data POST melalui raw json dengan tukang pos

107

Saya punya Postman (yang tidak terbuka di Chrome) dan saya mencoba melakukan permintaan POST menggunakan raw json.

Di tab Body saya telah memilih "raw" dan "JSON (application / json)" dengan body ini:

{
    "foo": "bar"
}

Untuk tajuk saya punya 1, Content-Type: application/json

Di sisi PHP yang saya lakukan print_r($_POST);untuk saat ini, dan saya mendapatkan array kosong.


Jika saya menggunakan jQuery dan melakukan:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Saya mendapatkan seperti yang diharapkan:

Array
(
    [foo] => bar
)

Jadi mengapa tidak bekerja dengan Postman?


Tangkapan layar tukang pos:

masukkan deskripsi gambar di sini

dan tajuk:

masukkan deskripsi gambar di sini

Dallas
sumber
Coba $ _REQUEST sebagai gantinya $ _POST dan var_dump () sebagai gantinya print_r ()
Jauh
@Deep Saya dapatkan array(1) {["foo"]=> string(3) "bar"}dengan jQuery dan masih kosong dengan Postman:array(0) {}
Dallas
Jadi Postman tidak mengirim permintaan
Deep
@smerny di kiriman Anda fieldsdan footidak akan cocok sehingga tidak akan berfungsi, saya tidak yakin apakah itu salah ketik tetapi pastikan mereka cocok
meda
@meda, benar itu salah ketik, tetapi jika saya memiliki bidang, itu masih harus memiliki keluaran dalam var dump $ _REQUEST atau $ _POST
Dallas

Jawaban:

38

Tidak seperti jQueryuntuk membaca mentah, JSONAnda harus mendekodekannya dalam PHP.

print_r(json_decode(file_get_contents("php://input"), true));

php://input adalah aliran hanya baca yang memungkinkan Anda membaca data mentah dari isi permintaan.

$_POSTadalah variabel bentuk, Anda harus beralih ke formtombol radio postmankemudian menggunakan:

foo=bar&foo2=bar2

Untuk memposting mentah jsondengan jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});
meda
sumber
ya persis posting variabel json vs posting berbeda
meda
43

Cukup centang opsi JSON dari drop-down di sebelah biner; saat Anda mengklik mentah. Ini harus dilakukan

skill synon pass json ke postman

Itachi
sumber
4
ini adalah posting yang cukup lama .. tetapi jika Anda melihat pertanyaannya, Anda akan melihat bahwa saya melakukan itu. Anda mungkin ingin membaca pertanyaan, jawaban yang dipilih, dan komentar pada jawaban yang dipilih untuk memahami masalah dan solusi dengan lebih baik.
Dallas
1
Tentu, tapi ini sebenarnya menunjukkan masalah yang saya miliki; Saya telah memilih "Teks", bukan application / json, meskipun itu sudah disebutkan di bagian Header. Ini membingungkan; jika Anda memilih "Teks", maka seluruh "kode" HTTP POST akan ditampilkan, termasuk JSON, yang saya harapkan dapat berfungsi, karena ini panggilan POST penuh, bukan hanya json.
Ted
7

jawaban meda sepenuhnya sah, tetapi ketika saya menyalin kode saya mendapat kesalahan!

Di suatu tempat di "php://input"sana ada karakter yang tidak valid (mungkin salah satu tanda kutip?).

Ketika saya mengetik "php://input"kode secara manual, itu berhasil. Butuh beberapa saat untuk mencari tahu!

CoredusK
sumber
1
Senang saya menggulir sedikit lebih jauh dan melihat ini - Saya mengalami masalah yang sama. Temuan bagus!
Charlie Stanard
2
Sepertinya seseorang telah memperbaikinya dalam pengeditan pada postingan meda. Tapi saya melihat riwayat edit dan menemukan bahwa posting asli memiliki 200c 200b(karakter lebar nol) antara "n" dan "p" di "input". Tidak yakin bagaimana dia bisa berakhir dengan itu, tapi sekarang sudah diperbaiki.
Dallas
6

Saya menghadapi masalah yang sama, kode berikut berfungsi untuk saya:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);

Neo
sumber
1

Instal aplikasi asli Postman, ekstensi Chrome sudah tidak digunakan lagi. (Punyaku terbuka di jendela sendiri tetapi masih berjalan sebagai aplikasi Chrome)

Jaroslav Štreit
sumber
2
Ini tidak menjawab pertanyaan itu.
jhpratt
@jhpratt sebenarnya. Saya memiliki masalah yang sama. Saat digunakan aplikasi Postman, itu berhasil. Pertanyaannya adalah: Jadi mengapa tidak bekerja dengan Postman?
Jaroslav Štreit