JavaRush /Курси /Модуль 5. Spring /Робота з запитами: @PathVariable, @RequestParam

Робота з запитами: @PathVariable, @RequestParam

Модуль 5. Spring
Рівень 7 , Лекція 3
Відкрита

Тепер перейдемо до важливої частини роботи з запитами — їхніх параметрів. У цій лекції розберемо, як витягувати значення з 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 найчастіше пов'язані з невідповідністю імені змінної, відсутністю значення, неправильними налаштуваннями обов'язковості або невірним типом.

Наприклад:

  1. Якщо в маршруті вказане неправильне ім'я змінної (/{id}) і в анотації (@PathVariable("userId")), Spring кине виключення.
  2. Якщо параметр запиту заданий як обов'язковий, але не надісланий клієнтом, буде помилка 400 Bad Request.
  3. Неправильний тип даних (наприклад, спроба передати рядок там, де очікується Long) призведе до виключення HttpMessageNotReadableException.

Як виправляти помилки

  • Використовуй однакові імена для змінних у маршруті і в анотаціях.
  • Пам'ятай, що для @RequestParam можна вказати значення за замовчуванням через defaultValue.
  • Будь уважним до типів даних: якщо очікується Long, а передано рядкове значення, це викличе помилку.

Тепер ти озброєний знаннями про те, як працювати з параметрами запитів у Spring MVC. Це відкриває перед тобою багато можливостей для створення гнучких маршрутів і обробки складних веб-запитів! У наступних лекціях ти навчишся валідації даних при роботі з запитами та дізнаєшся, як Spring MVC допомагає уникати типових помилок.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ