Введение в GraphQL API на Java
GraphQL — это современный язык запросов для API, который позволяет клиентам запрашивать только те данные, которые им действительно нужны. В отличие от REST, где структура ответа фиксирована, GraphQL даёт гибкость и эффективность. В этом пошаговом туториале мы создадим полноценный GraphQL API на Java с использованием популярной библиотеки graphql-java и Spring Boot. Вы научитесь настраивать сервер, определять схему, писать резолверы и выполнять запросы. Все примеры кода готовы к запуску.
Что вы узнаете
- Как настроить Spring Boot проект для GraphQL
- Как определить схему GraphQL (типы, запросы, мутации)
- Как написать резолверы на Java
- Как выполнять query и mutation запросы
1. Настройка проекта и зависимости
Для начала создадим проект Spring Boot с Maven. Добавим необходимые зависимости в pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>5.0.2</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
Эти библиотеки обеспечивают интеграцию GraphQL с Spring Boot и удобную работу со схемами. После добавления зависимостей обновите проект.
Структура проекта
Наш проект будет содержать следующие основные компоненты:
- Схема GraphQL (файл
schema.graphqls) - Модели данных (Java POJO)
- Резолверы (обработчики запросов)
- Контроллер для тестирования
2. Определение схемы GraphQL
Создайте файл src/main/resources/schema.graphqls. В нём мы опишем типы данных и доступные операции. Для примера возьмём модель "Книга":
type Book {
id: ID!
title: String!
author: String!
year: Int
}
type Query {
getBook(id: ID!): Book
getAllBooks: [Book]
}
type Mutation {
addBook(title: String!, author: String!, year: Int): Book
}
Здесь Book — это объектный тип с обязательными полями (!). Query определяет точки входа для чтения данных, а Mutation — для изменения. Обратите внимание: в GraphQL мутации используются для создания, обновления и удаления данных.
3. Создание Java-моделей и резолверов
Модель Book
Создадим простой POJO-класс Book.java:
public class Book {
private String id;
private String title;
private String author;
private int year;
public Book(String id, String title, String author, int year) {
this.id = id;
this.title = title;
this.author = author;
this.year = year;
}
// геттеры и сеттеры
public String getId() { return id; }
public String getTitle() { return title; }
public String getAuthor() { return author; }
public int getYear() { return year; }
}
Резолвер для Query
Резолверы связывают схему с данными. Создадим класс QueryResolver.java:
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class QueryResolver implements GraphQLQueryResolver {
private final List<Book> books = new ArrayList<>();
public QueryResolver() {
books.add(new Book("1", "Java для всех", "Иван Петров", 2021));
books.add(new Book("2", "GraphQL в действии", "Анна Смирнова", 2023));
}
public Book getBook(String id) {
return books.stream()
.filter(b -> b.getId().equals(id))
.findFirst()
.orElse(null);
}
public List<Book> getAllBooks() {
return books;
}
}
Методы getBook и getAllBooks соответствуют полям из схемы. GraphQL автоматически свяжет их по имени.
Резолвер для Mutation
Теперь создадим MutationResolver.java:
import com.coxautodev.graphql.tools.GraphQLMutationResolver;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class MutationResolver implements GraphQLMutationResolver {
private final List<Book> books = new ArrayList<>();
// Конструктор инициализирует те же книги (для простоты)
public MutationResolver() {
books.add(new Book("1", "Java для всех", "Иван Петров", 2021));
books.add(new Book("2", "GraphQL в действии", "Анна Смирнова", 2023));
}
public Book addBook(String title, String author, int year) {
String id = UUID.randomUUID().toString();
Book newBook = new Book(id, title, author, year);
books.add(newBook);
return newBook;
}
}
Метод addBook принимает аргументы, создаёт объект и возвращает его. GraphQL сам сериализует ответ в JSON.
4. Запуск и тестирование API
Добавим главный класс приложения Application.java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
После запуска приложения GraphQL endpoint будет доступен по адресу http://localhost:8080/graphql. Для тестирования используйте любой HTTP-клиент (Postman, curl) или встроенный GraphiQL (если подключена зависимость graphiql-spring-boot-starter).
Примеры запросов
Query: получить все книги
{
getAllBooks {
id
title
author
year
}
}
Ответ:
Блоги
Рекомендаций по книгам
Читайте также
Безопасность Java приложений: топ-10 уязвимостей и как их избежать