Saya mengirimkan sebagai POST ke halaman php berikut ini:
{a:1}
Ini adalah badan permintaan (permintaan POST).
Dalam php, apa yang harus saya lakukan untuk mengekstraksi nilai itu?
var_dump($_POST);
bukan solusinya, tidak bekerja.
Saya mengirimkan sebagai POST ke halaman php berikut ini:
{a:1}
Ini adalah badan permintaan (permintaan POST).
Dalam php, apa yang harus saya lakukan untuk mengekstraksi nilai itu?
var_dump($_POST);
bukan solusinya, tidak bekerja.
Jawaban:
Untuk mengakses badan entitas dari permintaan POST atau PUT (atau metode HTTP lainnya):
$entityBody = file_get_contents('php://input');
Selain itu, STDIN
konstanta adalah aliran yang sudah terbuka php://input
, sehingga Anda dapat melakukannya sebagai alternatif:
$entityBody = stream_get_contents(STDIN);
Dari entri manual PHP pada I / O streams docs :
php: // input adalah aliran hanya baca yang memungkinkan Anda membaca data mentah dari badan permintaan. Dalam hal permintaan POST, lebih baik menggunakan php: // input daripada
$HTTP_RAW_POST_DATA
tidak tergantung pada arahan khusus php.ini. Selain itu, untuk kasus-kasus di mana$HTTP_RAW_POST_DATA
tidak diisi secara default, itu berpotensi alternatif yang kurang intensif memori untuk mengaktifkan always_populate_raw_post_data. php: // input tidak tersedia dengan enctype = "multipart / form-data".
Khususnya Anda ingin mencatat bahwa php://input
aliran, terlepas dari bagaimana Anda mengaksesnya di web SAPI, tidak dapat dicari . Ini berarti hanya dapat dibaca sekali. Jika Anda bekerja di lingkungan tempat entitas entitas HTTP besar diunggah secara rutin, Anda mungkin ingin mempertahankan input dalam bentuk alirannya (alih-alih buffering seperti contoh pertama di atas).
Untuk menjaga sumber daya aliran, sesuatu seperti ini dapat membantu:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
memungkinkan Anda untuk mengelola konsumsi memori karena akan secara transparan beralih ke penyimpanan sistem file setelah sejumlah data disimpan (secara default 2M). Ukuran ini dapat dimanipulasi dalam file php.ini atau dengan menambahkan /maxmemory:NN
, di mana NN
jumlah maksimum data yang disimpan dalam memori sebelum menggunakan file sementara, dalam byte.
Tentu saja, kecuali Anda memiliki alasan yang sangat bagus untuk mencari di aliran input, Anda seharusnya tidak memerlukan fungsi ini dalam aplikasi web. Membaca badan entitas HTTP permintaan biasanya sudah cukup - jangan biarkan klien menunggu sepanjang hari sementara aplikasi Anda menentukan apa yang harus dilakukan.
Perhatikan bahwa php: // input tidak tersedia untuk permintaan yang menentukan Content-Type: multipart/form-data
header ( enctype="multipart/form-data"
dalam bentuk HTML). Ini hasil dari PHP sudah mem-parsing formulir data ke $_POST
superglobal.
php://input
juga kosong untuk application/x-www-form-urlencoded
tipe konten (selain multipart/form-data
)
php://input
ada. Jadi, sementara pada konfigurasi (Cepat) CGI stream_get_contents(STDIN)
tidak akan berfungsi, file_get_contents("php://input")
akan.
mengembalikan nilai dalam array
$data = json_decode(file_get_contents('php://input'), true);
$data
array asosiatif untuk memeriksa apakah setiap nilai dikodekan sesuai keinginan Anda. Cara "stream-to-datatype" dalam melihat sesuatu mungkin sederhana, tetapi mungkin tidak seefisien berurusan dengan pengkodean dalam "bentuk aliran" menggunakan filter aliran. Jika Anda tidak menangani masalah penyandian dan hanya membersihkan dan memvalidasi, Anda kehilangan satu langkah.
Kemungkinan alasan untuk kosong $_POST
adalah bahwa permintaannya bukan POST
, atau tidak POST
lagi ... Itu mungkin sudah dimulai sebagai pos, tetapi menemui 301
atau 302
mengarahkan ulang ke suatu tempat, yang dialihkan ke GET
!
Periksa $_SERVER['REQUEST_METHOD']
untuk memeriksa apakah ini masalahnya.
Lihat https://stackoverflow.com/a/19422232/109787 untuk diskusi yang baik tentang mengapa hal ini tidak boleh terjadi tetapi masih terjadi.
POST
tetapi setelah memeriksanya ternyata memang benar GET
. Setelah saya menambahkan /
di akhir URL saya, itu mulai menunjukkan POST. Aneh!
Periksa $HTTP_RAW_POST_DATA
variabelnya
php://input
. $HTTP_RAW_POST_DATA
tidak tersedia dengan enctype="multipart/form-data"
.
Jika Anda telah menginstal ekstensi HTTP PECL, Anda dapat menggunakan http_get_request_body()
fungsi ini untuk mendapatkan data tubuh sebagai string.
Jika Anda menginstal ekstensi pecl / http , Anda juga dapat menggunakan ini:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
adalah false
, bahwa array kosong harus dikembalikan. Bagaimana jika seseorang telah mengirimkan XML atau YAML? Tambahkan tes untuk Tipe-Konten dan pergi dari sana.
$_SERVER
superglobal untuk mengetahui nilai berguna.
http_get_request_body()
secara eksplisit dibuat untuk mendapatkan tubuh PUT
dan POST
permintaan sesuai dokumentasi http://php.net/manual/fa/function.http-get-request-body.php
$_POST
superglobal. Ini juga (terutama) benar dalam kasus permintaan PUT, karena PHP tidak memiliki superglobal yang sesuai.