Давайте застосуємо отримані знання на практиці і створимо 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 став зручним і професійним.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ