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 Optionalid){ 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 MapallParams) { 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 Listid) { 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 .