Введение: REST API — это проще, чем кажется
Многие начинающие разработчики считают, что написание REST API на Java — это сложная задача, требующая глубоких знаний и долгих часов работы. На самом деле, с современными инструментами, такими как Spring Boot, вы можете создать полноценный RESTful сервис буквально за 30 минут. В этой статье мы на практике разберем, как написать REST API на Java, используя минимальный набор инструментов. Вы получите готовый шаблон, который сможете адаптировать под свои проекты.
REST (Representational State Transfer) — это архитектурный стиль, который позволяет клиентам и серверам обмениваться данными через HTTP. Мы создадим простое API для управления списком задач (To-Do). К концу статьи у вас будет работающий сервер, который умеет создавать, читать, обновлять и удалять задачи (CRUD).
Шаг 1: Подготовка окружения и создание проекта
Для начала нам понадобятся:
- Java Development Kit (JDK) версии 17 или выше.
- IntelliJ IDEA (Community Edition) или любая другая IDE.
- Maven для управления зависимостями.
- Postman или браузер для тестирования.
Создадим проект с помощью Spring Initializr (start.spring.io). Выберите следующие настройки:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x
- Dependencies: Spring Web, Spring Data JPA, H2 Database
Скачайте ZIP-архив и распакуйте его. Откройте проект в IDE. Структура будет выглядеть так:
src/
└── main/
├── java/com/example/restapi/
│ ├── RestapiApplication.java
│ ├── controller/
│ ├── model/
│ └── repository/
└── resources/
└── application.properties
Это база, с которой мы начнем. Подготовка заняла буквально 2 минуты.
Шаг 2: Создание модели данных и репозитория
Начнем с модели. Создайте класс Task.java в папке model. Это будет сущность, которая представляет задачу:
package com.example.restapi.model;
import jakarta.persistence.*;
@Entity
@Table(name = "tasks")
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
private boolean completed;
// Конструкторы
public Task() {}
public Task(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; }
}
Теперь создадим репозиторий. В папке repository создайте интерфейс TaskRepository.java:
package com.example.restapi.repository;
import com.example.restapi.model.Task;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
// JpaRepository уже предоставляет все базовые CRUD-методы
}
На этом этапе мы описали структуру данных и способ взаимодействия с базой. Spring Data JPA автоматически создаст таблицу в H2 и предоставит методы findAll(), save(), deleteById() и другие. Это сэкономит часы ручного кодирования.
Шаг 3: Создание контроллера с REST-эндпоинтами
Теперь самое интересное — контроллер. В папке controller создайте класс TaskController.java. Он будет обрабатывать HTTP-запросы:
package com.example.restapi.controller;
import com.example.restapi.model.Task;
import com.example.restapi.repository.TaskRepository;
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/tasks")
public class TaskController {
@Autowired
private TaskRepository taskRepository;
// GET: получить все задачи
@GetMapping
public List<Task> getAllTasks() {
return taskRepository.findAll();
}
// GET: получить задачу по ID
@GetMapping("/{id}")
public ResponseEntity<Task> getTaskById(@PathVariable Long id) {
return taskRepository.findById(id)
.map(task -> ResponseEntity.ok(task))
.orElse(ResponseEntity.notFound().build());
}
// POST: создать новую задачу
@PostMapping
public ResponseEntity<Task> createTask(@RequestBody Task task) {
Task savedTask = taskRepository.save(task);
return ResponseEntity.status(HttpStatus.CREATED).body(savedTask);
}
// PUT: обновить задачу
@PutMapping("/{id}")
public ResponseEntity<Task> updateTask(@PathVariable Long id, @RequestBody Task taskDetails) {
return taskRepository.findById(id)
.map(task -> {
task.setTitle(taskDetails.getTitle());
task.setCompleted(taskDetails.isCompleted());
Task updatedTask = taskRepository.save(task);
return ResponseEntity.ok(updatedTask);
})
.orElse(ResponseEntity.notFound().build());
}
// DELETE: удалить задачу
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteTask(@PathVariable Long id) {
if (taskRepository.existsById(id)) {
taskRepository.deleteById(id);
return ResponseEntity.noContent().build();
}
return ResponseEntity.notFound().build();
}
}
Всего 5 методов, которые реализуют полный CRUD. Обратите внимание на аннотации:
@RestController— говорит Spring, что это REST-контроллер.@RequestMapping("/api/tasks")— базовый URL для всех эндпоинтов.@GetMapping,@PostMapping,@PutMapping,@DeleteMapping— привязывают HTTP-методы.@PathVariable— извлекает ID из URL.@RequestBody— преобразует JSON из тела запроса в объект Java.
Этот контроллер — сердце нашего REST API. Вы можете расширять его, добавляя новые эндпоинты, например, для фильтрации или пагинации.
Шаг 4: Настройка и запуск приложения
Осталось настроить базу данных. Откройте файл application.properties в папке resources и добавьте:
spring.application.name=rest-api
server.port=8080
#