Давайте применим полученные знания на практике и создадим REST API для работы с сущностями.
Пошаговый план создания REST API
В этой лекции мы создадим REST API для управления сущностями "Пользователь" (User). Мы начнем с создания проекта Spring Boot и шаг за шагом реализуем CRUD (Create, Read, Update, Delete) API.
1. Создание проекта Spring Boot
Для начала нам понадобится новый Spring Boot проект.
Используем Spring Initializr:
- Перейдите на Spring Initializr.
- Укажите следующие параметры:
- Project: Maven
- Language: Java
- Spring Boot: 2.x.x (или новее)
- Dependencies: Spring Web, Spring Data JPA, H2 Database (или другой), Lombok (необязательно, но удобно).
- Скачайте и распакуйте проект.
2. Настройка application.properties
Сначала настроим базу данных. В файле src/main/resources/application.properties укажите параметры для подключения H2 Database:
# Конфигурация H2 Database
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
Мы используем H2 — встроенную базу данных для простоты разработки. Если вы хотите использовать другую базу данных, например PostgreSQL, нужно будет внести соответствующие изменения.
3. Создание сущности User
Пора приступать к работе. Вначале определим сущность User, которая будет представлять пользователя в нашей системе.
package com.example.demo.entity;
import jakarta.persistence.*;
import lombok.Data;
@Data // Аннотация Lombok для автоматической генерации геттеров/сеттеров
@Entity // Отмечаем класс как JPA-сущность
@Table(name = "users") // Указываем название таблицы
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Автоматическая генерация ID
private Long id;
@Column(nullable = false) // Поле не может быть пустым
private String name;
@Column(nullable = false, unique = true) // Уникальный email
private String email;
@Column(nullable = false)
private Integer age;
}
4. Создание JPA-репозитория
Теперь создадим репозиторий для взаимодействия с базой данных.
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
// JpaRepository предоставляет готовые методы для работы с БД
public interface UserRepository extends JpaRepository<User, Long> {
}
5. Создание REST-контроллера
Теперь переходим к самому интересному — реализации REST API! Создадим контроллер, который будет отвечать за операции CRUD для сущностей User.
Пример кода:
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController // Отмечаем класс как REST-контроллер
@RequestMapping("/api/users") // Базовый путь для всех эндпоинтов
public class UserController {
private final UserRepository userRepository;
// Внедряем зависимость через конструктор
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
// Получение всех пользователей (GET /api/users)
@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}
// Получение одного пользователя по ID (GET /api/users/{id})
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userRepository.findById(id)
.map(ResponseEntity::ok) // Если пользователь найден
.orElse(ResponseEntity.notFound().build()); // Если не найден
}
// Создание нового пользователя (POST /api/users)
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
// Обновление существующего пользователя (PUT /api/users/{id})
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
return userRepository.findById(id)
.map(user -> {
user.setName(updatedUser.getName());
user.setEmail(updatedUser.getEmail());
user.setAge(updatedUser.getAge());
return ResponseEntity.ok(userRepository.save(user));
})
.orElse(ResponseEntity.notFound().build());
}
// Удаление пользователя (DELETE /api/users/{id})
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
return userRepository.findById(id)
.map(user -> {
userRepository.delete(user);
return ResponseEntity.noContent().build();
})
.orElse(ResponseEntity.notFound().build());
}
}
ResponseEntity, чтобы клиент мог получить правильный HTTP-статус-код (например, 404, если пользователь не найден).
6. Тестирование API
Теперь давайте протестируем наш API. Вы можете использовать инструмент, например Postman, для отправки запросов.
Примеры запросов:
- GET /api/users — получение всех пользователей.
- POST /api/users — создание пользователя. Пример тела запроса:
{ "name": "Иван Иванов", "email": "ivan@example.com", "age": 25 } - GET /api/users/1 — получение пользователя с ID = 1.
- PUT /api/users/1 — обновление пользователя. Пример тела запроса:
{ "name": "Иван Петров", "email": "petrov@example.com", "age": 30 } - DELETE /api/users/1 — Удаление пользователя с ID = 1.
7. Возможные ошибки и их устранение
Проблема: поле email не уникально
Если вы попытаетесь добавить двух пользователей с одинаковым email, то получите ошибку базы данных. Чтобы этого избежать, можно добавить предобработку данных (например, проверку существующего email перед созданием пользователя).
Проблема: валидация
Сейчас данные не валидируются. Например, можно создать пользователя с пустым именем. Мы исправим это позже, используя аннотацию @Valid.
Проблема: ошибки сериализации
Если объект содержит ссылки на другие сущности с циклическими зависимостями, Jackson может выдать ошибку. Решение: использовать аннотацию @JsonIgnore (мы вернемся к этому в будущем).
8. Применение в реальных проектах
REST API, созданный в этой лекции, — это основа любого современного приложения. Вы сможете использовать этот подход для управления сущностями, такими как товары, заказы, сотрудники и многое другое. Такие навыки необходимы для работы Java-разработчиком, особенно в веб-приложениях и микросервисах.
Теперь вы знаете, как создать REST API "с нуля". В следующей лекции мы рассмотрим, как правильно проектировать URI и работать с ресурсами, чтобы ваш API стал удобным и профессиональным.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ