Рубрики
Без рубрики

Аннотация Spring @RequestParam

Подробное руководство по аннотации @RequestParam Spring

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы рассмотрим аннотацию Spring @RequestParam и ее атрибуты.

Проще говоря, мы можем использовать @RequestParam для извлечения параметров запроса, параметров формы и даже файлов из запроса.

Дальнейшее чтение:

Spring @RequestMapping Новые аннотации ярлыков

Аннотации Spring @Controller и @RestController

2. Простое Сопоставление

Допустим, у нас есть конечная точка /api/foos , которая принимает параметр запроса с именем id :

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

В этом примере мы использовали @RequestParam для извлечения параметра id запроса.

Простой запрос GET вызовет getFoos :

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

Далее, давайте посмотрим на атрибуты аннотации: имя , значение , обязательное и значение по умолчанию .

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(значение) или просто @RequestParam(“идентификатор”).

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;
}

В этом случае оба:

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

и

http://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");
}

В этом случае нам не нужно указывать атрибут required .

И значение по умолчанию будет использоваться, если параметр запроса не указан:

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

5. Значение по умолчанию для параметра запроса

Мы также можем установить значение по умолчанию для @RequestParam с помощью атрибута Значение по умолчанию :

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

Это похоже на required=false, в том, что пользователю больше не нужно указывать параметр :

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

Хотя, мы все еще в порядке, чтобы предоставить его:

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

Обратите внимание, что когда мы устанавливаем атрибут defaultValue , required действительно имеет значение false .

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' http://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 сопоставит разделенный запятыми id параметр :

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

или список отдельных id параметров :

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

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

В этой статье мы узнали, как использовать @RequestParam.

Полный исходный код примеров можно найти в проекте GitHub .