Mengendalikan Data Bentuk Encoded URL pada Spring REST

REST Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

Bagi pengguna akhir, proses pengiriman borang adalah mudah, dan sampai batas tertentu, setara dengan memasukkan data dan mengklik butang kirim. Walau bagaimanapun, dari perspektif kejuruteraan, diperlukan mekanisme pengekodan untuk menghantar dan menerima data ini dengan pasti dari sisi klien ke sisi pelayan untuk pemprosesan back-end.

Bagi skop tutorial ini, kita akan memberi tumpuan kepada mewujudkan satu bentuk yang menghantar data sebagai application / x-www-bentuk-urlencoded jenis kandungan dalam aplikasi web Spring.

2. Pengekodan Data Bentuk

Kaedah HTTP yang paling biasa digunakan untuk penghantaran borang adalah POST. Namun, untuk penyerahan borang yang tidak berpatutan, kami juga dapat menggunakan kaedah HTTP GET. Dan, cara menentukan kaedah adalah melalui atribut kaedah borang.

Untuk borang yang menggunakan kaedah GET, keseluruhan data borang dihantar sebagai sebahagian daripada rentetan pertanyaan. Tetapi, jika kita menggunakan kaedah POST, maka datanya dikirim sebagai bagian dari badan permintaan HTTP.

Lebih-lebih lagi, dalam kes terakhir, kita juga dapat menentukan pengekodan data dengan atribut enctype form , yang dapat mengambil dua nilai, yaitu aplikasi / x-www-form-urlencoded dan multipart / form-data .

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

Bentuk HTML mempunyai nilai default aplikasi / x-www-form-urlencoded untuk atribut enctype kerana ini mengurus kes penggunaan asas di mana data sepenuhnya teks. Walaupun begitu, jika kes penggunaan kami melibatkan data fail yang menyokong, maka kami harus menggantinya dengan nilai data multipart / form-data .

Pada dasarnya, ia menghantar data bentuk sebagai pasangan nilai-kunci yang dipisahkan oleh watak ampersand (&). Juga, kunci dan nilai masing-masing dipisahkan dengan tanda sama dengan (=). Selanjutnya, semua watak terpelihara dan bukan alfanumerik dikodkan menggunakan pengekodan peratus.

3. Penyerahan Borang di Penyemak Imbas

Setelah asas kita diliputi, mari kita lihat dan lihat bagaimana kita dapat menangani data borang yang dikodkan URL untuk kes penggunaan mudah untuk maklum balas dalam aplikasi web Spring.

3.1. Model Domain

Untuk borang maklum balas kami, kami perlu mengambil pengecam e-mel pengirim bersama dengan komen. Oleh itu, mari buat model domain kami di kelas Maklum Balas :

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

3.2. Buat Borang

Untuk menggunakan templat HTML ringkas untuk membuat borang web dinamik kami, kami perlu mengkonfigurasi Thymeleaf dalam projek kami. Selepas ini, kami bersedia untuk menambahkan titik akhir / maklum balas GET yang akan memberikan paparan maklum balas untuk borang :

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

Perhatikan bahawa kami menggunakan maklum balas sebagai atribut model untuk menangkap input pengguna. Seterusnya, mari buat paparan maklum balas dalam templat feedback.html :

Sudah tentu, kita tidak perlu menyatakan atribut enctype secara eksplisit kerana ia akan memilih nilai lalai aplikasi / x-www-form-urlencoded .

3.3. Aliran PRG

Oleh kerana kami menerima input pengguna melalui borang maklum balas penyemak imbas, kami mesti melaksanakan aliran kerja penyerahan POST / REDIRECT / GET (PRG) untuk mengelakkan penduaan pendua .

Pertama, mari kita laksanakan POST endpoint / web / feedback yang akan bertindak sebagai pengendali tindakan untuk borang maklum balas:

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

Seterusnya, kita dapat melaksanakan titik akhir / maklum balas / kejayaan pengalihan yang melayani permintaan GET:

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

Untuk mengesahkan fungsi aliran kerja penyerahan borang dalam penyemak imbas, mari lawati localhost: 8080 / maklum balas :

Akhirnya, kami juga dapat memeriksa bahawa data borang dihantar dalam bentuk URL yang dikodkan:

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

4. Permintaan Bukan Penyemak Imbas

Kadang-kadang, kami mungkin tidak mempunyai klien HTTP berasaskan penyemak imbas. Sebaliknya, pelanggan kami boleh menjadi utiliti seperti cURL atau Postman. Dalam kes sedemikian, kami tidak memerlukan borang web HTML. Sebagai gantinya, kita dapat melaksanakan titik akhir / maklum balas 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); }

Sekiranya tidak ada bentuk HTML dalam aliran data kami, kami tidak semestinya perlu menerapkan pola PRG. Walau bagaimanapun, kita mesti menentukan bahawa sumber tersebut menerima APPLICATION_FORM_URLENCODED_VALUE jenis media .

Akhirnya, kami dapat 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. Asas FormHttpMessageConverter

Permintaan HTTP yang mengirimkan data aplikasi / x-www-form-urlencoded mesti menentukan ini dalam tajuk Jenis Kandungan . Secara dalaman, Spring menggunakan kelas FormHttpMessageConverter untuk membaca data ini dan mengikatnya dengan parameter kaedah.

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 mengetahui secara ringkas mengenai pengekodan data bentuk dalam bentuk web. Kami juga meneroka cara menangani data yang dikodkan URL untuk permintaan HTTP penyemak imbas dan bukan penyemak imbas dengan menerapkan borang maklum balas dalam aplikasi web Spring Boot.

Seperti biasa, kod sumber lengkap untuk tutorial boleh didapati di GitHub.

REST bawah

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

>> SEMAK KURSUS