GraphQL API с Java: пошаговый туториал на практике

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

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

Начать курс

Введение в 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
  }
}

Ответ:

Блоги

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