Menangani Data Formulir yang Dikodekan URL di Spring REST

REST Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Untuk pengguna akhir, proses pengiriman formulir nyaman, dan sampai batas tertentu, setara dengan hanya memasukkan data dan mengklik tombol kirim. Namun, dari perspektif teknik, dibutuhkan mekanisme encoding untuk mengirim dan menerima data ini dengan andal dari sisi klien ke sisi server untuk pemrosesan back-end.

Untuk cakupan tutorial ini, kami akan fokus pada pembuatan formulir yang mengirimkan datanya sebagai tipe konten application / x-www-form-urlencoded dalam aplikasi web Spring.

2. Formulir Pengkodean Data

Metode HTTP yang paling umum digunakan untuk pengiriman formulir adalah POST. Namun, untuk pengiriman formulir idempoten, kita juga dapat menggunakan metode HTTP GET. Dan, cara untuk menentukan metode adalah melalui atribut metode formulir.

Untuk formulir yang menggunakan metode GET, seluruh data formulir dikirim sebagai bagian dari string kueri. Tapi, jika kita menggunakan metode POST, maka datanya dikirim sebagai bagian dari isi permintaan HTTP.

Selain itu, dalam kasus terakhir, kita juga dapat menentukan pengkodean data dengan atribut enctype formulir , yang dapat mengambil dua nilai, yaitu application / x-www-form-urlencoded dan multipart / form-data .

2.1. Aplikasi Jenis Media / x-www-form-urlencoded

Formulir HTML memiliki nilai default application / x-www-form-urlencoded untuk atribut enctype karena ini menangani kasus penggunaan dasar di mana data seluruhnya berupa teks. Namun demikian, jika kasus penggunaan kami melibatkan data file pendukung, maka kami harus menggantinya dengan nilai multipart / form-data .

Pada dasarnya, ini mengirimkan data formulir sebagai key-value pair yang dipisahkan oleh karakter ampersand (&). Selain itu, kunci dan nilai masing-masing dipisahkan dengan tanda sama dengan (=). Selanjutnya, semua karakter yang dicadangkan dan non-alfanumerik dikodekan menggunakan encoding persen.

3. Pengiriman Formulir di Browser

Sekarang setelah kita memiliki dasar-dasar yang tercakup, mari kita lanjutkan dan lihat bagaimana kita dapat menangani data formulir yang dikodekan URL untuk kasus penggunaan sederhana dari pengiriman umpan balik di aplikasi web Spring.

3.1. Model Domain

Untuk formulir umpan balik kami, kami perlu menangkap pengenal email pengirim bersama dengan komentarnya. Jadi, mari buat model domain kita di kelas Umpan Balik :

public class Feedback { private String emailId; private String comment; }

3.2. Buat Formulir

Untuk menggunakan template HTML sederhana untuk membuat formulir web dinamis kita, kita perlu mengkonfigurasi Thymeleaf dalam proyek kita. Setelah ini, kami siap untuk menambahkan titik akhir GET / umpan balik yang akan melayani tampilan umpan balik untuk formulir :

@GetMapping(path = "/feedback") public String getFeedbackForm(Model model) { Feedback feedback = new Feedback(); model.addAttribute("feedback", feedback); return "feedback"; }

Perhatikan bahwa kami menggunakan umpan balik sebagai atribut model untuk menangkap input pengguna. Selanjutnya, mari buat tampilan umpan balik di template feedback.html :

Tentu saja, kita tidak perlu secara eksplisit menentukan atribut enctype karena ini akan memilih nilai default application / x-www-form-urlencoded .

3.3. PRG Flow

Saat kami menerima masukan pengguna melalui formulir umpan balik browser, kami harus menerapkan alur kerja pengiriman POST / REDIRECT / GET (PRG) untuk menghindari pengiriman duplikat .

Pertama, mari implementasikan titik akhir POST / web / umpan balik yang akan bertindak sebagai pengendali tindakan untuk formulir umpan balik:

@PostMapping( path = "/web/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public String handleBrowserSubmissions(Feedback feedback) throws Exception { // Save feedback data return "redirect:/feedback/success"; }

Selanjutnya, kita dapat mengimplementasikan redirect endpoint / feedback / success yang melayani permintaan GET:

@GetMapping("/feedback/success") public ResponseEntity getSuccess() { return new ResponseEntity("Thank you for submitting feedback.", HttpStatus.OK); }

Untuk memvalidasi fungsionalitas alur kerja pengiriman formulir di browser, kunjungi localhost: 8080 / umpan balik :

Terakhir, kita juga dapat memeriksa bahwa data formulir dikirim dalam bentuk yang dikodekan URL:

emailId=abc%40example.com&comment=Sample+Feedback

4. Permintaan Non-Browser

Terkadang, kami mungkin tidak memiliki klien HTTP berbasis browser. Sebaliknya, klien kami dapat berupa utilitas seperti cURL atau Postman. Dalam kasus seperti itu, kami tidak memerlukan formulir web HTML. Sebagai gantinya, kita dapat mengimplementasikan endpoint / feedback yang melayani permintaan POST:

@PostMapping( path = "/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public ResponseEntity handleNonBrowserSubmissions(@RequestBody Feedback feedback) throws Exception { // Save feedback data return new ResponseEntity("Thank you for submitting feedback", HttpStatus.OK); }

Dengan tidak adanya formulir HTML dalam aliran data kami, kami tidak perlu menerapkan pola PRG. Namun, kita harus menentukan bahwa sumber daya menerima APPLICATION_FORM_URLENCODED_VALUE jenis media .

Akhirnya, kita bisa mengujinya dengan permintaan cURL:

curl -X POST \ //localhost:8080/feedback \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'emailId=abc%40example.com&comment=Sample%20Feedback'

4.1. Dasar-dasar FormHttpMessageConverter

Permintaan HTTP yang mengirimkan data application / x-www-form-urlencoded harus menentukan ini di header Jenis Konten . Secara internal, Spring menggunakan kelas FormHttpMessageConverter untuk membaca data ini dan mengikatnya dengan parameter metode.

In cases where our method parameter is of a type MultiValueMap, we can use either the @RequestParam or @RequestBody annotation to bind it appropriately with the body of the HTTP request. That's because the Servlet API combines the query parameters and form data into a single map called parameters, and that includes automatic parsing of the request body:

@PostMapping( path = "/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public ResponseEntity handleNonBrowserSubmissions( @RequestParam MultiValueMap paramMap) throws Exception { // Save feedback data return new ResponseEntity("Thank you for submitting feedback", HttpStatus.OK); }

However, for a method parameter of type other than MultiValueMap, such as our Feedback domain object, we must use only the @RequestBody annotation.

5. Conclusion

Dalam tutorial ini, kami mempelajari secara singkat tentang pengkodean data formulir dalam formulir web. Kami juga mempelajari cara menangani data yang dikodekan URL untuk permintaan HTTP browser dan non-browser dengan mengimplementasikan formulir umpan balik di aplikasi web Spring Boot.

Seperti biasa, kode sumber lengkap untuk tutorial tersedia di GitHub.

REST bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya