Как написать REST API на Java за 30 минут: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как написать REST API на Java за 30 минут

Современная веб-разработка немыслима без REST API — архитектурного стиля, который позволяет клиентам и серверам обмениваться данными по протоколу HTTP. Java, благодаря своей надежности и огромной экосистеме, остается одним из лучших языков для создания бэкенд-сервисов. В этой статье мы покажем, как за 30 минут написать полноценное REST API на Java с помощью Spring Boot — самого популярного фреймворка для микросервисов. Вы создадите простой CRUD-сервис для управления списком задач (Todo List), который можно сразу развернуть и протестировать.

Что такое REST API и почему Java?

REST (Representational State Transfer) — это набор принципов, при котором каждый ресурс (например, пользователь, задача или товар) имеет уникальный URL, а взаимодействие происходит через стандартные HTTP-методы: GET (получение), POST (создание), PUT (обновление) и DELETE (удаление). Java с фреймворком Spring Boot предоставляет готовые аннотации и инструменты, чтобы реализовать REST API буквально за несколько минут. Вам не нужно вручную парсить JSON или настраивать сервер — всё это делает Spring.

Пошаговая инструкция: пишем REST API на Java за 30 минут

Шаг 1. Настройка проекта и зависимости

Самый быстрый способ начать — использовать Spring Initializr. Выберите следующие параметры:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.0 (или последняя стабильная версия)
  • Dependencies: Spring Web, Spring Data JPA, H2 Database

Нажмите "Generate", скачайте ZIP-архив и распакуйте его. Откройте проект в вашей IDE (IntelliJ IDEA, Eclipse или VS Code). Файл pom.xml должен содержать следующие зависимости:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

База данных H2 — это встроенная in-memory СУБД, которая не требует установки. Для продакшена вы замените её на PostgreSQL или MySQL.

Шаг 2. Создание модели данных (Entity)

Создайте пакет model и в нём класс TodoItem.java. Это будет сущность, которая отображается на таблицу в базе данных.

package com.example.demo.model;

import jakarta.persistence.*;

@Entity
@Table(name = "todos")
public class TodoItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String title;

    private boolean completed;

    // Конструкторы
    public TodoItem() {}

    public TodoItem(String title, boolean completed) {
        this.title = title;
        this.completed = completed;
    }

    // Геттеры и сеттеры
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }

    public boolean isCompleted() { return completed; }
    public void setCompleted(boolean completed) { this.completed = completed; }
}

Здесь мы используем аннотации JPA: @Entity сообщает Spring, что класс — это таблица, @Id — первичный ключ, а @GeneratedValue — автогенерация ID.

Шаг 3. Репозиторий для работы с базой данных

Создайте пакет repository и в нём интерфейс TodoRepository.java. Spring Data JPA автоматически реализует все CRUD-методы.

package com.example.demo.repository;

import com.example.demo.model.TodoItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TodoRepository extends JpaRepository<TodoItem, Long> {
    // Дополнительные методы можно добавить по необходимости
}

Интерфейс JpaRepository уже содержит методы findAll(), findById(), save(), deleteById() — всё, что нужно для REST API.

Шаг 4. Контроллер — сердце REST API

Создайте пакет controller и класс TodoController.java. Именно здесь мы определим эндпоинты.

package com.example.demo.controller;

import com.example.demo.model.TodoItem;
import com.example.demo.repository.TodoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/todos")
public class TodoController {

    @Autowired
    private TodoRepository todoRepository;

    // GET: получить все задачи
    @GetMapping
    public List<TodoItem> getAllTodos() {
        return todoRepository.findAll();
    }

    // GET: получить задачу по ID
    @GetMapping("/{id}")
    public ResponseEntity<TodoItem> getTodoById(@PathVariable Long id) {
        return todoRepository.findById(id)
                .map(todo -> ResponseEntity.ok(todo))
                .orElse(ResponseEntity.notFound().build());
    }

    // POST: создать новую задачу
    @PostMapping
    public ResponseEntity<TodoItem> createTodo(@RequestBody TodoItem todo) {
        TodoItem savedTodo = todoRepository.save(todo);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedTodo);
    }

    // PUT: обновить задачу
    @PutMapping("/{id}")
    public ResponseEntity<TodoItem> updateTodo(@PathVariable Long id, @RequestBody TodoItem todoDetails) {
        return todoRepository.findById(id)
                .map(todo -> {
                    todo.setTitle(todoDetails.getTitle());
                    todo.setCompleted(todoDetails.isCompleted());
                    TodoItem updatedTodo = todoRepository.save(todo);
                    return ResponseEntity.ok(updatedTodo);
                })
                .orElse(ResponseEntity.notFound().build());
    }

    // DELETE: удалить задачу
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteTodo(@PathVariable Long id) {
        return todoRepository.findById(id)
                .map(todo -> {
                    todoRepository.delete(todo);
                    return ResponseEntity.noContent().build();
                })
                .orElse(ResponseEntity.notFound().build());
    }
}

Объяснение аннотаций:

Блоги

Рекомендаций по книгам