Перейти к основному содержимому

Весенняя аннотация @RequestParam

· 4 мин. чтения

Задача: Сумма двух

Дано массив целых чисел и целая сумма. Нужно найти индексы двух чисел, сумма которых равна заданной ...

ANDROMEDA

1. Обзор

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

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

2. Простое отображение

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

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

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

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

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

Далее давайте посмотрим на атрибуты аннотации: name , value , required и 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(value = «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;
}

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

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

а также

http://localhost:8080/spring-mvc-basics/api/foos
----
ID: null

будет правильно вызывать метод.

Если параметр не указан, параметр метода привязывается к null .

4.1. Использование Java 8 (необязательно)

В качестве альтернативы мы можем обернуть параметр в Optional :

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

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

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

http://localhost:8080/spring-mvc-basics/api/foos 
----
ID: not provided

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

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

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

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

http://localhost:8080/spring-mvc-basics/api/foos
----
ID: test

Тем не менее, мы все еще можем предоставить его:

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

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

6. Сопоставление всех параметров

Мы также можем иметь несколько параметров без определения их имен или количества, просто используя Map :

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

который затем отразит любые отправленные параметры:

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

7. Отображение многозначного параметра

Один @RequestParam может иметь несколько значений:

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

И Spring MVC сопоставит параметр id с разделителями-запятыми :

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

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

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

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

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

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