Ответ
Spring предоставляет несколько аннотаций для работы с параметрами запроса, выбор зависит от их типа, количества и семантики.
Основные механизмы:
-
@RequestParam— для извлечения отдельных параметров из query string.@GetMapping("/users") public List<User> getUsers(@RequestParam String name, @RequestParam(required = false, defaultValue = "0") int page) { // Обработка параметров name и page } // Запрос: GET /users?name=John&page=2 -
@RequestParamсMapилиMultiValueMap— для получения всех параметров запроса в виде коллекции, когда их имена или количество неизвестны заранее.@GetMapping("/filter") public List<User> filter(@RequestParam MultiValueMap<String, String> allParams) { // allParams содержит все пары ключ=значение из URL } -
@PathVariable— для извлечения параметров, которые являются частью пути URL.@GetMapping("/users/{id}/orders/{orderId}") public Order getOrder(@PathVariable Long id, @PathVariable String orderId) { ... } // Запрос: GET /users/42/orders/abc-123 -
@RequestBody— для приема сложных структур данных (JSON, XML) в теле запроса (обычно POST/PUT). Это основной способ для передачи DTO.@PostMapping("/users") public User createUser(@RequestBody UserCreateRequest request) { // request — это десериализованный JSON из тела запроса } -
@ModelAttribute— для привязки параметров запроса (из query string или form-data) к полям объекта модели. Часто используется в MVC с HTML-формами.@PostMapping("/register") public String register(@ModelAttribute RegistrationForm form) { ... } // Параметры ?username=test&email=test@ex.com будут привязаны к полям формы
Рекомендация по выбору:
- Для фильтрации, сортировки, пагинации используйте
@RequestParam. - Для идентификации ресурса в пути —
@PathVariable. - Для создания или сложного обновления данных —
@RequestBody. - Для динамических или неопределенных наборов параметров —
MultiValueMap.