Saya memiliki pustaka javascript yang mengirimkan permintaan POST ke servlet Java saya, tetapi dalam doPost
metode ini, saya tidak bisa mendapatkan konten dari muatan permintaan. Di Chrome Developer Tools, semua konten ada di bagian Minta Payload di tab header, dan kontennya ada di sana, dan saya tahu bahwa POST sedang diterima oleh metode doPost, tetapi hasilnya kosong.
Untuk HttpServletRequest
objek, dengan cara apa saya bisa mendapatkan data di payload permintaan?
Melakukan request.getParameter()
atau request.getAttributes()
keduanya berakhir tanpa data
Jawaban:
Jawaban sederhana:
Gunakan getReader () untuk membaca isi permintaan
Info selengkapnya:
Ada dua metode untuk membaca data di body:
getReader()
mengembalikan BufferedReader yang memungkinkan Anda membaca isi permintaan.getInputStream()
mengembalikan ServletInputStream jika Anda perlu membaca data biner.Catatan dari dokumen: "[Metode mana pun] dapat dipanggil untuk membaca isi, bukan keduanya."
sumber
Menggunakan metode ini
sumber
request.getInputStream()
tidak menghormati pengkodean karakter permintaan sepertirequest.getReader()
halnya. Jadi contoh ini menggunakan charset sistem default.new BufferedReader(new InputStreamReader(request.getInputStream()))
dapat disederhanakan menjadi hanyarequest.getReader()
yang sudah di-buffer dan juga mempertahankan encoding permintaan.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
ketika saya memanggil getReader () sebagai akibat dari pembaca sudah terbuka.Anda dapat menggunakan Buffer Reader dari permintaan untuk membaca
sumber
Aliran Java 8
sumber
(accumulator, actual) -> accumulator + actual
denganString::concat
.Dengan Apache Commons IO, Anda dapat melakukan ini dalam satu baris.
sumber
Jika isi body berupa string di Java 8 Anda bisa melakukan:
String body = request.getReader().lines().collect(Collectors.joining());
sumber
Jika Anda dapat mengirim payload dalam JSON, ini adalah cara paling nyaman untuk membaca playload:
Contoh kelas data:
Contoh payload (isi permintaan):
Kode untuk membaca payload di servlet (membutuhkan com.google.gson. *):
Itu saja. Bagus, mudah dan bersih. Jangan lupa untuk mengatur header tipe konten ke application / json.
sumber
Menggunakan Java 8 coba dengan sumber daya:
sumber
Anda hanya butuh
untuk mendapatkan POST dan GET - Parameter.
Metode mengembalikan a
Map<String,String[]>
.Anda dapat membaca parameter di Peta dengan
sumber
application/x-www-form-urlencoded
; Sebabmultipart/form-data
, Anda tampaknya perlu mengakses bagian tubuh melaluirequest.getReader()
dan menguraikannya secara manual.