file_get_contents ("php: // input") atau $ HTTP_RAW_POST_DATA, mana yang lebih baik untuk mendapatkan isi permintaan JSON?

120

file_get_contents("php://input")atau $HTTP_RAW_POST_DATA- mana yang lebih baik untuk mendapatkan isi permintaan JSON?

Dan jenis permintaan ( GETatau POST) apa yang harus saya gunakan untuk mengirim data JSON saat menggunakan sisi klien XmlHTTPRequest?

Pertanyaan saya terinspirasi dari jawaban ini: Bagaimana cara memposting JSON ke PHP dengan curl

Kutipan dari jawaban itu:

Dari perspektif protokol file_get_contents("php://input")sebenarnya lebih tepat, karena Anda tidak benar-benar memproses data bentuk multi bagian http.

Manuel Bitto
sumber

Jawaban:

195

Sebenarnya php://inputmemungkinkan Anda untuk membaca data POST mentah.

Ini adalah alternatif yang tidak banyak menggunakan memori untuk $ HTTP_RAW_POST_DATA dan tidak memerlukan arahan php.ini khusus .

php://inputtidak tersedia dengan enctype="multipart/form-data".

Referensi: http://php.net/manual/en/wrappers.php.php

zaf
sumber
12
Selain itu, mulai PHP 5.6, $HTTP_RAW_POST_DATAdianggap tidak digunakan lagi, dan php://inputdapat digunakan kembali.
Chris Forrence
Lihat juga enable_post_data_reading.
Pacerier
json_decode (file_get_contents ('php: // input'), true) apakah ini mendukung PHP 7.1 untuk mendapatkan nilai $ _GET dari URL?
Kailas
$ HTTP_RAW_POST_DATA sudah tidak digunakan lagi sejak PHP 7
Daniel
15

php: // input adalah aliran hanya-baca yang memungkinkan Anda membaca data mentah dari isi permintaan. Dalam kasus permintaan POST, lebih disukai menggunakan php: // input daripada $ HTTP_RAW_POST_DATA karena tidak bergantung pada arahan khusus php.ini . Selain itu, untuk kasus di mana $ HTTP_RAW_POST_DATA tidak diisi secara default, ini adalah alternatif yang berpotensi mengurangi penggunaan memori untuk mengaktifkan always_populate_raw_post_data.

Sumber: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
sumber
4
Selain itu, mulai PHP 5.6, $HTTP_RAW_POST_DATA dianggap tidak digunakan lagi, dan php://inputdapat digunakan kembali.
Chris Forrence
14

file_get_contents (php: // input) - mendapatkan data POST mentah dan Anda perlu menggunakannya saat menulis API dan membutuhkan input XML / JSON / ... yang tidak dapat didekodekan menjadi $ _POST oleh PHP Beberapa contoh:

kirim melalui string JSON pos

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
sumber
3

Aturan biasa harus berlaku untuk cara Anda mengirim permintaan. Jika permintaan adalah untuk mengambil informasi (misalnya hasil 'petunjuk' sebagian dari pencarian, atau halaman baru yang akan ditampilkan, dll ...) Anda dapat menggunakan GET. Jika data yang dikirim adalah bagian dari permintaan untuk mengubah sesuatu (memperbarui database, menghapus record, dll ..) maka gunakan POST.

Di sisi server, tidak ada alasan untuk menggunakan input mentah, kecuali jika Anda ingin mengambil seluruh blok data posting / dapatkan dalam sekali jalan. Anda dapat mengambil informasi spesifik yang Anda inginkan melalui array _GET / _POST seperti biasa. Library AJAX seperti MooTools / jQuery akan menangani bagian tersulit dalam melakukan panggilan AJAX yang sebenarnya dan mengkodekan data formulir ke dalam format yang sesuai untuk Anda.

Marc B
sumber
Itulah intinya: saya ingin mengambil seluruh posting / mendapatkan blok data dalam sekali jalan, karena JSON adalah format tanpa variabel, itu hanya menyajikan data.
Manuel Bitto
@Kucebe Saya tidak mengerti mengapa ini perlu, mengapa tidak memasukkan data JSON ke dalam bidang POST dan selesai dengannya?
Pekka
Jika Anda menginginkan seluruh blok JSON, mengapa tidak menetapkan blok teks JSON ke bidang formulir dan mengirimkannya seperti itu? <input type="hidden" name="data" value="json data here" />sepenuhnya dapat diterima dan memungkinkan Anda mengambilnya secara sepele di sisi server dengan $ _REQUEST ['data'].
Marc B
3
Menyematkan JSON dalam bidang POST mengalahkan tujuan tag tipe konten HTTP, dan tidak sebaik untuk men-debug di Fiddler dan debugger browser (yang dapat memahami JSON). Selain itu, banyak pustaka JavaScript pihak ketiga, muatan POST JSON sebagai application / json.
CyberMonk
2

Untuk data JSON, jauh lebih mudah untuk POST sebagai tipe konten "application / json". Jika Anda menggunakan GET, Anda harus mengenkode URL JSON dalam parameter dan itu agak berantakan. Selain itu, tidak ada batasan ukuran saat Anda melakukan POST. DAPATKAN ukuran jika sangat terbatas (maksimal 4K).

ZZ Coder
sumber
2
Biasanya ada batas ukuran untuk POST, tetapi biasanya disetel cukup tinggi. Periksa Anda php.ini.
Brad
2

Pertanyaan kedua Anda mudah, GET memiliki batasan ukuran 1-2 kilobyte di sisi server dan browser, jadi segala jenis data yang lebih besar harus Anda kirim melalui POST.

Pekka
sumber