Anotasi Spring @RequestParam

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan menerangkan anotasi @RequestParam Spring dan atributnya.

Ringkasnya, kita dapat menggunakan @RequestParam untuk mengekstrak parameter pertanyaan, parameter bentuk, dan bahkan fail dari permintaan tersebut.

2. Pemetaan Ringkas

Katakan bahawa kita mempunyai titik akhir / api / musuh yang mengambil parameter pertanyaan yang disebut id :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam String id) { return "ID: " + id; }

Dalam contoh ini, kami menggunakan @RequestParam untuk mengekstrak parameter pertanyaan id .

Permintaan GET yang sederhana akan meminta getFoos :

//localhost:8080/api/foos?id=abc ---- ID: abc

Seterusnya, mari kita lihat atribut anotasi: nama , nilai , wajib , dan nilai default .

3. Menentukan Nama Parameter Permintaan

Dalam contoh sebelumnya, kedua-dua nama pemboleh ubah dan nama parameter adalah sama.

Kadang-kadang kita mahu ini berbeza. Atau, jika kita tidak menggunakan Spring Boot, kita mungkin perlu melakukan konfigurasi waktu kompilasi khas atau nama parameter sebenarnya tidak akan ada dalam bytecode.

Nasib baik, kita dapat mengkonfigurasi nama @RequestParam menggunakan atribut name :

@PostMapping("/api/foos") @ResponseBody public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { return "ID: " + fooId + " Name: " + name; }

Kita juga boleh melakukan @RequestParam (nilai = "id") atau hanya @RequestParam ("id").

4. Parameter Permintaan Pilihan

Parameter kaedah yang dijelaskan dengan @RequestParam diperlukan secara lalai.

Ini bermaksud bahawa jika parameter tidak ada dalam permintaan, kami akan mendapat ralat:

GET /api/foos HTTP/1.1 ----- 400 Bad Request Required String parameter 'id' is not present

Kami boleh mengkonfigurasi @RequestParam kami untuk menjadi pilihan, dengan atribut yang diperlukan :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(required = false) String id) { return "ID: " + id; }

Dalam kes ini, kedua-duanya:

//localhost:8080/api/foos?id=abc ---- ID: abc

dan

//localhost:8080/api/foos ---- ID: null

akan menggunakan kaedah dengan betul.

Apabila parameter tidak ditentukan, parameter metode terikat nol .

4.1. Menggunakan Java 8 Pilihan

Sebagai alternatif, kita dapat membungkus parameter dalam Pilihan :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam Optional id){ return "ID: " + id.orElseGet(() -> "not provided"); }

Dalam hal ini, kita tidak perlu menentukan atribut yang diperlukan .

Dan nilai lalai akan digunakan jika parameter permintaan tidak diberikan:

//localhost:8080/api/foos ---- ID: not provided

5. Nilai Lalai untuk Parameter Permintaan

Kami juga dapat menetapkan nilai lalai ke @RequestParam dengan menggunakan atribut defaultValue :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(defaultValue = "test") String id) { return "ID: " + id; }

Ini seperti diperlukan = salah, kerana pengguna tidak perlu lagi memberikan parameter :

//localhost:8080/api/foos ---- ID: test

Walaupun, kami masih boleh memberikannya:

//localhost:8080/api/foos?id=abc ---- ID: abc

Perhatikan bahawa ketika kita menetapkan atribut defaultValue , yang diperlukan memang disetel ke false .

6. Memetakan Semua Parameter

Kita juga boleh mempunyai beberapa parameter tanpa menentukan nama mereka atau menghitung dengan hanya menggunakan Peta :

@PostMapping("/api/foos") @ResponseBody public String updateFoos(@RequestParam Map allParams) { return "Parameters are " + allParams.entrySet(); }

yang kemudian akan mencerminkan kembali parameter yang dihantar:

curl -X POST -F 'name=abc' -F 'id=123' //localhost:8080/api/foos ----- Parameters are {[name=abc], [id=123]}

7. Memetakan Parameter Berbilang Nilai

Satu @RequestParam boleh mempunyai pelbagai nilai:

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam List id) { return "IDs are " + id; }

Dan Spring MVC akan memetakan parameter id yang dipisahkan koma :

//localhost:8080/api/foos?id=1,2,3 ---- IDs are [1,2,3]

atau senarai parameter id berasingan :

//localhost:8080/api/foos?id=1&id=2 ---- IDs are [1,2]

8. Kesimpulannya

Dalam artikel ini, kami belajar menggunakan @RequestParam.

Kod sumber lengkap untuk contoh boleh didapati dalam projek GitHub.