Анотация на пролетта @RequestParam

1. Общ преглед

В този бърз урок ще изследваме анотацията @RequestParam на Spring и нейните атрибути.

Най-просто казано, можем да използваме @RequestParam за извличане на параметри на заявката, параметри на формуляри и дори файлове от заявката.

2. Просто картографиране

Да кажем, че имаме крайна точка / api / foos, която приема параметър на заявката, наречен id :

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

В този пример използвахме @RequestParam за извличане на параметъра за заявка id .

Една проста GET заявка би извикала getFoos :

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

След това нека да разгледаме атрибутите на анотацията: име , стойност , задължително и defaultValue .

3. Посочване на името на параметъра на заявката

В предишния пример името на променливата и името на параметъра са еднакви.

Понякога обаче искаме те да бъдат различни. Или, ако не използваме Spring Boot, може да се наложи да направим специална конфигурация по време на компилация или имената на параметрите всъщност няма да бъдат в байт кода.

За щастие можем да конфигурираме името @RequestParam, като използваме атрибута name :

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

Можем също да направим @RequestParam (стойност = “id”) или просто @RequestParam (“id”).

4. Незадължителни параметри на заявката

Параметрите на метода, анотирани с @RequestParam, се изискват по подразбиране.

Това означава, че ако параметърът не присъства в заявката, ще получим грешка:

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

Можем да конфигурираме нашия @RequestParam да бъде по избор, но с необходимия атрибут:

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

В този случай и двете:

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

и

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

ще извика правилно метода.

Когато параметърът не е посочен, параметърът на метода е обвързан с нула .

4.1. Използване на Java 8 По избор

Като алтернатива можем да обгърнем параметъра по избор :

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

В този случай не е необходимо да посочваме необходимия атрибут.

И стойността по подразбиране ще се използва, ако параметърът на заявката не е предоставен:

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

5. Стойност по подразбиране за параметъра на заявката

Също така можем да зададем стойност по подразбиране на @RequestParam, като използваме атрибута defaultValue :

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

Това е като задължително = невярно, тъй като потребителят вече не трябва да предоставя параметъра :

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

Въпреки че все още сме добре да го предоставим:

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

Имайте предвид, че когато ние си поставихме за defaultValue атрибут, необходима е наистина настроен на фалшива .

6. Картиране на всички параметри

Можем също да имаме множество параметри, без да дефинираме имената им или да броим, като просто използваме Карта :

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

което след това ще отразява обратно всички изпратени параметри:

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

7. Картиране на параметър с много стойности

Един @RequestParam може да има множество стойности:

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

И Spring MVC ще картографира параметър за идентификация, разделен със запетая :

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

или списък с отделни параметри за идентификация :

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

8. Заключение

В тази статия научихме как да използваме @RequestParam.

Пълният изходен код за примерите може да бъде намерен в проекта GitHub.