JavaRush /Курси /Модуль 5. Spring /Створення CRUD API з використанням REST

Створення CRUD API з використанням REST

Модуль 5. Spring
Рівень 10 , Лекція 4
Відкрита

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 — це базовий будівельний блок будь-якого серверного проєкту. Тож відшліфуйте свій навик до досконалості, бо від нього залежить успіх вашого додатка.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ