Какие механизмы в Spring используются для обработки HTTP-запросов с множеством параметров?

«Какие механизмы в Spring используются для обработки HTTP-запросов с множеством параметров?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring предоставляет несколько аннотаций для работы с параметрами запроса, выбор зависит от их типа, количества и семантики.

Основные механизмы:

  1. @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
  2. @RequestParam с Map или MultiValueMap — для получения всех параметров запроса в виде коллекции, когда их имена или количество неизвестны заранее.

    @GetMapping("/filter")
    public List<User> filter(@RequestParam MultiValueMap<String, String> allParams) {
        // allParams содержит все пары ключ=значение из URL
    }
  3. @PathVariable — для извлечения параметров, которые являются частью пути URL.

    @GetMapping("/users/{id}/orders/{orderId}")
    public Order getOrder(@PathVariable Long id, @PathVariable String orderId) { ... }
    // Запрос: GET /users/42/orders/abc-123
  4. @RequestBody — для приема сложных структур данных (JSON, XML) в теле запроса (обычно POST/PUT). Это основной способ для передачи DTO.

    @PostMapping("/users")
    public User createUser(@RequestBody UserCreateRequest request) {
        // request — это десериализованный JSON из тела запроса
    }
  5. @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.