Как написать 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());
}
}
Объяснение аннотаций: