Тепер перейдемо до важливої частини роботи з запитами — їхніх параметрів. У цій лекції розберемо, як витягувати значення з URL (path variables) і як обробляти параметри запитів (request parameters). Ці два підходи — основа для створення гнучких і функціональних веб-додатків.
Що таке параметри запиту і навіщо вони потрібні
Коли користувач відправляє запит на сервер (наприклад, щоб знайти певну статтю або профіль користувача), у запиті можуть передаватися дані. Ці дані можуть бути частиною URL або передаватися як параметри в рядку запиту (query string). Spring MVC пропонує простий і потужний спосіб витягування цих даних за допомогою анотацій @PathVariable і @RequestParam.
А навіщо це взагалі потрібно? Уяви: замість універсальної відповіді на запит типу «всі статті», ти хочеш показати статтю з конкретним ідентифікатором (наприклад, /articles/42). Або, скажімо, знайти товари по категорії з певним фільтром (наприклад, /products?category=books&sort=price-desc). У обох випадках треба обробити параметри запиту, щоб віддати користувачу потрібні дані.
Обробка змінних у шляху: анотація @PathVariable
Почнемо з @PathVariable. Ця анотація використовується для отримання значень прямо з URI (URL). Вона дозволяє гнучко визначати динамічні частини маршруту.
Приклад використання
Припустимо, ти хочеш показати профіль користувача по його ID. URL може виглядати так: /users/123. Тут 123 — це значення змінної в шляху.
Приклад коду:
@RestController
@RequestMapping("/users")
public class UserController {
// Обробляємо запит виду /users/123
@GetMapping("/{id}")
public String getUserById(@PathVariable("id") Long userId) {
// Тут можемо використовувати userId для пошуку користувача
return "Користувач з ID: " + userId;
}
}
Ключові моменти:
- Анотація
@PathVariableзв'язує значення з URL з параметром у методі. - У маршруті вказуємо динамічну частину шляху:
{id}. - У методі контролера використовуємо змінну
userIdдля обробки.
При запиті GET /users/123 сервер поверне відповідь: Користувач з ID: 123.
Трохи складніший приклад
Можна використовувати кілька змінних у шляху:
@RestController
@RequestMapping("/articles")
public class ArticleController {
@GetMapping("/{category}/{id}")
public String getArticleByCategoryAndId(@PathVariable String category, @PathVariable Long id) {
return "Стаття з категорії '" + category + "' з ID: " + id;
}
}
Тепер запит GET /articles/tech/42 поверне: Стаття з категорії 'tech' з ID: 42.
Як параметри потрапляють у запит: анотація @RequestParam
Якщо потрібно витягти дані з рядка запиту (query string), використовуй анотацію @RequestParam. Параметри передаються в URL після знака ? у форматі ключ=значення. Наприклад, /products?category=books.
Приклад використання
Створимо метод для пошуку товарів:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/search")
public String searchProducts(@RequestParam String category, @RequestParam(defaultValue = "price-asc") String sort) {
return "Пошук товарів у категорії: " + category + ", сортування: " + sort;
}
}
Тепер запит GET /products/search?category=electronics&sort=price-desc поверне: Пошук товарів у категорії: electronics, сортування: price-desc.
Ключові моменти:
- Анотація
@RequestParamвитягує значення з рядка запиту. - Поле
categoryобов'язкове, а дляsortзадано значення за замовчуваннямprice-asc.
Обробка необов'язкових параметрів
Можеш зробити деякі параметри необов'язковими:
@RestController
@RequestMapping("/products")
public class OptionalParamController {
@GetMapping("/filter")
public String filterProducts(@RequestParam(required = false) String category) {
if (category == null) {
return "Будь ласка, оберіть категорію!";
}
return "Фільтрація товарів за категорією: " + category;
}
}
Якщо запит прийде без параметра category, додаток коректно обробить ситуацію і поверне: Будь ласка, оберіть категорію!.
Порівняння @PathVariable і @RequestParam
| Характеристика | @PathVariable | @RequestParam |
|---|---|---|
| Джерело даних | Шлях URL | Рядок запиту |
| Приклад | /users/123 |
/search?category=books |
| Анотація | @PathVariable("ім'я") |
@RequestParam("ім'я") |
| Обов'язковість | Зазвичай обов'язковий параметр | Можна зробити необов'язковим |
| Сфера застосування | Унікальні ресурси (наприклад, ID) | Фільтри, сортування, додаткові параметри |
Приклад: комбінація @PathVariable і @RequestParam
Розглянемо приклад, де використовуються обидві анотації:
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{orderId}")
public String getOrderDetails(@PathVariable Long orderId,
@RequestParam(required = false) String includeDetails) {
if ("true".equals(includeDetails)) {
return "Деталі замовлення з ID: " + orderId + ". Інформація: [деталі замовлення]";
}
return "Замовлення з ID: " + orderId;
}
}
Запит GET /orders/99?includeDetails=true поверне: Деталі замовлення з ID: 99. Інформація: [деталі замовлення].
Запит GET /orders/99 поверне: Замовлення з ID: 99.
Типові помилки
Помилки при використанні @PathVariable і @RequestParam найчастіше пов'язані з невідповідністю імені змінної, відсутністю значення, неправильними налаштуваннями обов'язковості або невірним типом.
Наприклад:
- Якщо в маршруті вказане неправильне ім'я змінної (
/{id}) і в анотації (@PathVariable("userId")), Spring кине виключення. - Якщо параметр запиту заданий як обов'язковий, але не надісланий клієнтом, буде помилка
400 Bad Request. - Неправильний тип даних (наприклад, спроба передати рядок там, де очікується
Long) призведе до виключенняHttpMessageNotReadableException.
Як виправляти помилки
- Використовуй однакові імена для змінних у маршруті і в анотаціях.
- Пам'ятай, що для
@RequestParamможна вказати значення за замовчуванням черезdefaultValue. - Будь уважним до типів даних: якщо очікується
Long, а передано рядкове значення, це викличе помилку.
Тепер ти озброєний знаннями про те, як працювати з параметрами запитів у Spring MVC. Це відкриває перед тобою багато можливостей для створення гнучких маршрутів і обробки складних веб-запитів! У наступних лекціях ти навчишся валідації даних при роботі з запитами та дізнаєшся, як Spring MVC допомагає уникати типових помилок.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ