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 помогает избегать типичных ошибок.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ