JavaRush /Курсы /Модуль 5. Spring /Практика: создание простого REST API для работы с сущност...

Практика: создание простого REST API для работы с сущностями

Модуль 5. Spring
8 уровень , 5 лекция
Открыта

Давайте применим полученные знания на практике и создадим REST API для работы с сущностями.

Пошаговый план создания REST API

В этой лекции мы создадим REST API для управления сущностями "Пользователь" (User). Мы начнем с создания проекта Spring Boot и шаг за шагом реализуем CRUD (Create, Read, Update, Delete) API.

1. Создание проекта Spring Boot

Для начала нам понадобится новый Spring Boot проект.

Используем Spring Initializr:

  1. Перейдите на Spring Initializr.
  2. Укажите следующие параметры:
    • Project: Maven
    • Language: Java
    • Spring Boot: 2.x.x (или новее)
    • Dependencies: Spring Web, Spring Data JPA, H2 Database (или другой), Lombok (необязательно, но удобно).
  3. Скачайте и распакуйте проект.

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, для отправки запросов.

Примеры запросов:

  1. GET /api/users — получение всех пользователей.
  2. POST /api/users — создание пользователя. Пример тела запроса:
    
    {
        "name": "Иван Иванов",
        "email": "ivan@example.com",
        "age": 25
    }
    
  3. GET /api/users/1 — получение пользователя с ID = 1.
  4. PUT /api/users/1 — обновление пользователя. Пример тела запроса:
    
    {
        "name": "Иван Петров",
        "email": "petrov@example.com",
        "age": 30
    }
    
  5. DELETE /api/users/1 — Удаление пользователя с ID = 1.

7. Возможные ошибки и их устранение

Проблема: поле email не уникально

Если вы попытаетесь добавить двух пользователей с одинаковым email, то получите ошибку базы данных. Чтобы этого избежать, можно добавить предобработку данных (например, проверку существующего email перед созданием пользователя).

Проблема: валидация

Сейчас данные не валидируются. Например, можно создать пользователя с пустым именем. Мы исправим это позже, используя аннотацию @Valid.

Проблема: ошибки сериализации

Если объект содержит ссылки на другие сущности с циклическими зависимостями, Jackson может выдать ошибку. Решение: использовать аннотацию @JsonIgnore (мы вернемся к этому в будущем).


8. Применение в реальных проектах

REST API, созданный в этой лекции, — это основа любого современного приложения. Вы сможете использовать этот подход для управления сущностями, такими как товары, заказы, сотрудники и многое другое. Такие навыки необходимы для работы Java-разработчиком, особенно в веб-приложениях и микросервисах.

Теперь вы знаете, как создать REST API "с нуля". В следующей лекции мы рассмотрим, как правильно проектировать URI и работать с ресурсами, чтобы ваш API стал удобным и профессиональным.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ