webprogr.ru Новости

RSS

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...


Последние новости

Обработка параметров (PathVariable, RequestParam, RequestBody)

Обработка параметров (PathVariable, RequestParam, RequestBody)

@PathVariable – извлекает часть пути URL как значение переменной и передает в аргумент метода (например, {id} в /users/{id}).
@RequestParam – берет значения из параметров запроса (query string ?key=value или из form-data) и привязывает к параметру метода.
@RequestBody – автоматически десериализует тело HTTP-запроса (обычно JSON) в объект Java, передавая его в параметр метода.
Дополнительно: Spring поддерживает и другие виды параметров (@RequestHeader для заголовков, @CookieValue, @ModelAttribute и др.).

Пояснение:

Когда клиент отправляет запрос, он может передавать данные различными способами: в URL-пути, в строке запроса (после ?), в теле запроса, а также через заголовки. Spring MVC предоставляет аннотации для удобного получения этих данных прямо в методе контроллера.
@PathVariable используется для извлечения данных из динамических сегментов пути URL. В маршруте контроллера можно объявить шаблон с переменными в фигурных скобках, например /users/{id}. Если к нам пришел запрос GET /users/42, Spring вырежет подстроку 42 и передаст ее в аргумент, помеченный @PathVariable. Тип аргумента может быть числовым, строковым и т.д. – Spring автоматически преобразует строку "42" в Long или Integer при привязке. Имя переменной в аннотации должно совпадать с именем в шаблоне (или быть указано явно). Пример:
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long userId) {
// Spring извлечет {id} из URL и конвертирует в Long
return userService.findById(userId);
}
В этом примере при запросе /users/5 метод получит userId = 5. Если ID не является числом, Spring вернет код ошибки 400 (Bad Request), так как не смог привести тип.
@RequestParam применяется для доступа к параметрам запроса (Query Parameters), которые обычно передаются после ? в URL или в теле запроса типа form data. Например, запрос GET /products?category=books&sort=price_desc имеет два query-параметра: category и sort. В контроллере мы можем написать:
@GetMapping("/products")
public List<Product> findProducts(@RequestParam String category, 
@RequestParam(defaultValue="name") String sort) {
// category и sort будут привязаны из URL-параметров (sort имеет значение по умолчанию "name")
return productService.findByCategory(category, sort);
}
Здесь @RequestParam без имени автоматически ищет параметр с таким же именем, как аргумент (category, sort). Мы также указали defaultValue, чтобы если клиент не передаст sort, использовать значение "name". Параметры запроса чаще всего используются в GET-запросах для фильтрации, пагинации и пр. По умолчанию они обязательны; чтобы сделать параметр не обязательным, можно либо указать required=false, либо задать defaultValue. Если обязательный параметр отсутствует – Spring выбросит исключение MissingServletRequestParameterException, которое приведет к ошибке 400.
@RequestBody решает задачу извлечения данных из тела HTTP-запроса. Это особенно важно для методов вроде POST или PUT, где мы отправляем на сервер JSON-объект. Аннотация @RequestBody на параметре метода говорит Spring: прочитай тело запроса и десериализуй его в объект указанного типа. Десериализация выполняется автоматически с помощью HttpMessageConverter – по умолчанию, если подключен Jackson, JSON будет конвертирован в соответствующий класс. Например, метод:
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// на вход придет JSON с полями пользователя, Jackson преобразует его в объект User
return userService.save(user);
}
Если клиент отправит POST-запрос на /users с JSON-объектом в теле, содержащим, скажем, поля пользователя ({"name": "Ivan", "email": "ivan@example.com"}), то Spring создаст экземпляр User и заполнит его поля значениями из JSON (по именам полей). Далее этот объект user передается в наш метод. Таким образом, @RequestBody устраняет необходимость вручную парсить JSON – это происходит прозрачно. Разумеется, класс User должен иметь сеттеры или конструктор для полей (Jackson использует стандартные JavaBean-свойства или запись (record) Java для биндинга).
По умолчанию @RequestBody помечает параметр как обязательный. Если тело запроса пустое, Spring бросит HttpMessageNotReadableException (приводя к 400 Bad Request). Можно указать required=false, если нужен опциональный RequestBody.
Современные практики: при проектировании REST API желательно явно определять формат данных. Spring MVC автоматически соглашается на JSON, если клиент прислал Content-Type: application/json и принимает Accept: application/json (обычно это так). Также, начиная с Spring 3.2+, есть поддержка валидирования входных данных: можно пометить класс-дто аннотациями JSR-303 (например, @NotNull, @Size), а в методе контроллера добавить аннотацию @Valid перед @RequestBody. Тогда Spring автоматически провалидирует JSON по заданным правилам и в случае ошибок бросит MethodArgumentNotValidException (который по умолчанию вернет 400) – мы можем перехватить это и вернуть понятное описание ошибок (см. обработка ошибок ниже).
Кроме @PathVariable, @RequestParam, @RequestBody, Spring MVC предоставляет и другие аннотации для специальных случаев. Например, @RequestHeader – чтобы получить значение HTTP-заголовка, @CookieValue – значение cookie, @MatrixVariable – для матричных параметров в URI, и т.д. Также существует @ModelAttribute, которая в контексте REST редко применяется (она больше для связывания данных веб-форм). Но три упомянутых аннотации – самые часто используемые при написании REST-контроллеров.
Рейтинг@Mail.ru