Добро пожаловать на лекцию, где мы начнем погружаться в создание REST API с помощью Spring! Сегодня мы сосредоточимся непосредственно на REST-контроллерах, которые являются основой для работы с REST API. Если вы мечтали сделать свое первое полноценное взаимодействие клиента и сервера, то эта лекция как раз для вас.
Что такое REST-контроллер в Spring?
REST-контроллер в Spring — это компонент, который позволяет обрабатывать HTTP-запросы (GET, POST, PUT, DELETE и т.д.) и возвращать данные клиенту в нужном формате (обычно JSON). Контроллер — это "связное звено" между клиентом и серверными компонентами вашего приложения, такими как сервисы и репозитории.
Ключевым моментом является использование аннотации @RestController. Она автоматически сообщает Spring, что этот класс будет обрабатывать HTTP-запросы и возвращать данные в формате JSON или другого типа (XML, текст и т.д.).
@RestController совмещает функционал двух аннотаций:
@Controller (маркирует класс как контроллер) и
@ResponseBody (указывает, что данные возвращаются в теле HTTP-ответа, а не через страницу представления).
Отличие между @Controller и @RestController
Для лучшего понимания, давайте разберем разницу между этими аннотациями:
| Аннотация | Основное назначение |
|---|---|
@Controller |
Используется для генерации HTML-страниц с помощью шаблонизаторов, таких как Thymeleaf или JSP |
@RestController |
Предназначена для создания REST API, возвращает данные (в основном JSON). Все методы автоматически содержат @ResponseBody |
Если вам нужно взаимодействовать с клиентом через JSON, например, для мобильных приложений или SPA (Single Page Applications), то @RestController — это ваш лучший выбор. Он убирает лишнюю работу с представлениями, позволяя сосредоточиться на данных.
Настройка базового REST-контроллера
Шаг 1: Создание нового класса контроллера
Итак, давайте создадим базовый REST-контроллер для обработки запросов. Представим, что у нас есть сущность Customer, и мы хотим управлять данными об этой сущности.
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/customers")
public class CustomerController {
@GetMapping
public String getAllCustomers() {
return "Здесь будет список клиентов!";
}
}
@RestController: Маркируем класс как REST-контроллер.@RequestMapping("/api/customers"): Определяем базовый путь (URI) для всех запросов, связанных с клиентами.@GetMapping: Указываем, что метод обрабатывает HTTP-запросы типа GET.- Возврат строки: Это временный пример, позже мы заменим строку на реальные объекты.
Теперь, если вы запустите приложение и откроете браузер по адресу http://localhost:8080/api/customers, вы увидите: Здесь будет список клиентов!.
Шаг 2: Возвращение данных в формате JSON
REST API обычно возвращает данные в формате JSON. В мире Spring за это отвечает библиотека Jackson, которая автоматически конвертирует Java-объекты в JSON и обратно.
Давайте модифицируем наш пример, чтобы вернуть список клиентов:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/customers")
public class CustomerController {
@GetMapping
public List<String> getAllCustomers() {
return List.of("Иван Иванов", "Петр Петров", "Светлана Смирнова");
}
}
Теперь, если вы снова зайдете по адресу http://localhost:8080/api/customers, вы получите следующий JSON:
[
"Иван Иванов",
"Петр Петров",
"Светлана Смирнова"
]
Что произошло?
- Мы вернули список строк с именами клиентов.
- Jackson автоматически преобразовал
List<String>в JSON массив.
Конфигурация маршрутов с использованием аннотаций
Основные аннотации маршрутов
Spring предоставляет удобные аннотации для работы с различными HTTP-методами:
| Аннотация | Описание | Пример |
|---|---|---|
@GetMapping |
Обработка GET-запросов | Получение списка или одного ресурса |
@PostMapping |
Обработка POST-запросов | Создание нового ресурса |
@PutMapping |
Обработка PUT-запросов | Полное обновление существующего ресурса |
@DeleteMapping |
Обработка DELETE-запросов | Удаление ресурса |
@PatchMapping |
Обработка PATCH-запросов. | Частичное обновление ресурса |
Пример: работа с CRUD-операциями
Давайте создадим полноценный контроллер для управления клиентами с использованием всех перечисленных HTTP-методов. Для простоты данных пока будем использовать в памяти:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/customers")
public class CustomerController {
private final List<String> customers = new ArrayList<>(List.of("Иван Иванов", "Петр Петров"));
@GetMapping
public List<String> getAllCustomers() {
return customers;
}
@PostMapping
public String addCustomer(@RequestBody String customer) {
customers.add(customer);
return "Клиент добавлен: " + customer;
}
@PutMapping("/{index}")
public String updateCustomer(@PathVariable int index, @RequestBody String customer) {
customers.set(index, customer);
return "Клиент обновлен: " + customer;
}
@DeleteMapping("/{index}")
public String deleteCustomer(@PathVariable int index) {
String removed = customers.remove(index);
return "Клиент удален: " + removed;
}
}
- Работа с HTTP-методами: мы создали методы для всех CRUD-операций.
@RequestBody: используем для получения данных из тела запроса (например, POST или PUT).@PathVariable: извлекаем параметры пути (например, индекс клиента в списке).
Тестирование контроллера
Добавление нового клиента:
curl -X POST -H "Content-Type: application/json" -d "Светлана Смирнова" http://localhost:8080/api/customers
Ответ:
Клиент добавлен: Светлана Смирнова
Обновление клиента:
curl -X PUT -H "Content-Type: application/json" -d "Михаил Михайлов" http://localhost:8080/api/customers/0
Ответ:
Клиент обновлен: Михаил Михайлов
Удаление клиента:
curl -X DELETE http://localhost:8080/api/customers/1
Ответ:
Клиент удален: Петр Петров
Плюсы и практическое применение
Сегодня вы научились создавать REST-контроллеры с использованием @RestController. Это фундаментальный навык для работы с REST API. Вы будете использовать его постоянно, будь то разработка микросервиса, API для мобильного приложения или полноценного веб-приложения.
Типичные ошибки
Одна из распространенных ошибок — забыть добавить @RestController или @ResponseBody. В таком случае Spring не будет генерировать ответы в формате JSON, и клиенту может вернуться либо пустое тело, либо 404.
Также часто забывают настроить корректные пути (URI), из-за чего запросы не попадают в нужный метод. Не забудьте всегда использовать точные аннотации маршрутов, такие как @GetMapping или @PostMapping.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ