Какие есть способы передачи параметров в REST контроллере кроме @RequestParam в Spring
Что проверяют
Знаете ли вы, откуда Spring MVC берёт данные для аргументов метода. Следом обычно спрашивают, что происходит, когда параметр не пришёл или не прошёл валидацию, и какой код ответа получит клиент.
Как отвечать
Перечислите аннотации по частям запроса:
@PathVariable: сегмент пути,/users/{id}, обычно идентификатор ресурса;@RequestBody: тело, котороеHttpMessageConverter(как правило, Jackson) превращает в объект. В методе оно может быть только одно, поток тела читается один раз;@RequestHeader: заголовки, напримерAccept-Language. Все разом можно получить как@RequestHeader HttpHeaders;@CookieValue: значение cookie;@ModelAttribute: связывание параметров запроса или полей формы с объектом. Для непростых типов без аннотации он применяется по умолчанию, и фильтр из десяти параметров удобно принять одним DTO;@RequestPartиMultipartFile: части multipart-запроса, например файл вместе с JSON-метаданными;@MatrixVariable: параметры вида/cars;color=red. Встречаются редко, их поддержку может понадобиться включить в настройках сопоставления путей;- служебные аргументы:
HttpEntity<T>илиRequestEntity<T>для тела вместе с заголовками,Principalи@AuthenticationPrincipalиз Spring Security,Pageableиз Spring Data.
К @RequestBody и @ModelAttribute добавляют @Valid: ошибка превращается в MethodArgumentNotValidException и ответ 400, который оформляют в @RestControllerAdvice.
Где спотыкаются
Пишут @PathVariable Long id без имени и собирают проект без флага компилятора -parameters. Начиная со Spring Framework 6.1 имена параметров из отладочной информации больше не читаются, и запрос падает с ошибкой. spring-boot-starter-parent и Gradle-плагин Spring Boot флаг включают, самописная сборка может его не иметь.
Забывают, что @RequestHeader и @CookieValue по умолчанию обязательны. Отсутствующий заголовок даёт 400, а не null, если не указать required = false или Optional.
Кладут в путь и query-строку токены и персональные данные. URL оседает в логах прокси и балансировщика, для секретов есть заголовки и тело.