CRUD — це акронім із чотирьох операцій: Create (Створення), Read (Отримання), Update (Оновлення) і Delete (Видалення). В контексті REST API, CRUD відповідає наступному набору HTTP-методів:
| Операція (CRUD) | HTTP-метод | Призначення |
|---|---|---|
| Create | POST | Створення нового ресурсу |
| Read | GET | Отримання даних ресурсу |
| Update | PUT/PATCH | Зміна існуючого ресурсу |
| Delete | DELETE | Видалення ресурсу |
Створення CRUD API — це основа для взаємодії з будь-якими ресурсами в веб-застосунку. Давайте побудуємо своє перше повноцінне REST API для управління, наприклад, сутністю Product.
Розробка сутностей і репозиторіїв
Створення сутності Product
Для роботи з даними в базі в Spring ми використовуємо анотації JPA (Java Persistence API). Створимо клас Product, який буде представляти нашу сутність.
package com.example.demo.model;
import jakarta.persistence.*;
// Анотація @Entity робить клас сутністю JPA
@Entity
@Table(name = "products") // Назва таблиці в базі даних
public class Product {
@Id // Первинний ключ
@GeneratedValue(strategy = GenerationType.IDENTITY) // Автоінкремент
private Long id;
@Column(nullable = false) // Поле не повинно бути null
private String name;
private String description;
@Column(nullable = false)
private Double price;
// Геттери і сеттери (для роботи з полями через Hibernate)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
Створення репозиторію
Для взаємодії з базою даних ми використовуємо інтерфейси Spring Data JPA, такі як JpaRepository. Створимо репозиторій для сутності Product.
package com.example.demo.repository;
import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
// Репозиторій для роботи з Product
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
За допомогою цього репозиторію ми будемо виконувати всі базові операції з базою даних: збереження, отримання, видалення і оновлення записів.
Реалізація CRUD-контролерів
Тепер давайте створимо REST-контролер, який буде виконувати CRUD-операції.
Створення CRUD-контролера
package com.example.demo.controller;
import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
// Анотація @RestController вказує, що це RESTful контролер
@RestController
@RequestMapping("/api/products") // Базовий маршрут для всіх запитів
public class ProductController {
private final ProductRepository productRepository;
// Впровадження залежності через конструктор
public ProductController(ProductRepository productRepository) {
this.productRepository = productRepository;
}
// Отримання всіх продуктів (Read - GET)
@GetMapping
public List<Product> getAllProducts() {
return productRepository.findAll();
}
// Отримання продукту по ID (Read - GET)
@GetMapping("/{id}")
public ResponseEntity<Product> getProductById(@PathVariable Long id) {
return productRepository.findById(id)
.map(product -> ResponseEntity.ok(product))
.orElse(ResponseEntity.notFound().build());
}
// Створення нового продукту (Create - POST)
@PostMapping
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
Product savedProduct = productRepository.save(product);
return ResponseEntity.status(HttpStatus.CREATED).body(savedProduct);
}
// Оновлення існуючого продукту (Update - PUT)
@PutMapping("/{id}")
public ResponseEntity<Product> updateProduct(@PathVariable Long id, @RequestBody Product productDetails) {
return productRepository.findById(id)
.map(existingProduct -> {
existingProduct.setName(productDetails.getName());
existingProduct.setDescription(productDetails.getDescription());
existingProduct.setPrice(productDetails.getPrice());
Product updatedProduct = productRepository.save(existingProduct);
return ResponseEntity.ok(updatedProduct);
})
.orElse(ResponseEntity.notFound().build());
}
// Видалення продукту (Delete - DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
return productRepository.findById(id)
.map(product -> {
productRepository.delete(product);
return ResponseEntity.noContent().build();
})
.orElse(ResponseEntity.notFound().build());
}
}
REST API для операцій CRUD готовий. Додамо ще трохи практики.
Практичне завдання: перевірка роботи API
Запустіть додаток і переконайтеся, що він працює. Ось кілька прикладів запитів, які можна виконати за допомогою Postman або curl.
Створення продукту (POST)
Запит:
POST /api/products
Content-Type: application/json
{
"name": "Laptop",
"description": "A powerful gaming laptop",
"price": 1500.0
}
Відповідь:
{
"id": 1,
"name": "Laptop",
"description": "A powerful gaming laptop",
"price": 1500.0
}
Отримання всіх продуктів (GET)
Запит:
GET /api/products
Відповідь:
[
{
"id": 1,
"name": "Laptop",
"description": "A powerful gaming laptop",
"price": 1500.0
}
]
Оновлення продукту (PUT)
Запит:
PUT /api/products/1
Content-Type: application/json
{
"name": "Laptop Pro",
"description": "An even more powerful gaming laptop",
"price": 2000.0
}
Відповідь:
{
"id": 1,
"name": "Laptop Pro",
"description": "An even more powerful gaming laptop",
"price": 2000.0
}
Видалення продукту (DELETE)
Запит:
DELETE /api/products/1
Відповідь:
204 No Content
Типові помилки та їх вирішення
Помилка: Resource Not Found (404)
Якщо ви передаєте невірний ID ресурсу, додаток поверне 404 Not Found. Це коректна поведінка.
Порада: завжди перевіряйте ID перед запитом, щоб уникнути зайвої обробки.
Помилка: Invalid JSON Body
Якщо тіло запиту не відповідає очікуваному формату, ви отримаєте помилку 400 Bad Request.
Порада: переконайтеся, що ваш JSON сформований коректно, і використовуйте вбудовані інструменти в Postman або IDE для валідації.
Як це використовується в реальних проєктах
Створення REST API — це основа для більшості сучасних веб-застосунків. Потенційні сценарії:
- Управління каталогом товарів для інтернет-магазину.
- Інтеграція з мобільними пристроями для доставки даних.
- Взаємодія між мікросервісами через REST API.
Ваші CRUD API — це базовий будівельний блок будь-якого серверного проєкту. Тож відшліфуйте свій навик до досконалості, бо від нього залежить успіх вашого додатка.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ