Введение:

GraphQL — это язык запросов для вашего API и среда выполнения для выполнения запросов к вашим данным. Он представляет собой более эффективную, мощную и гибкую альтернативу традиционному REST API. В этом руководстве мы узнаем, как интегрировать GraphQL с Spring Boot и создать простое приложение. Мы будем использовать Java, Spring Boot и библиотеку graphql-java для создания нашего приложения.

Предпосылки:

Прежде чем мы начнем, убедитесь, что в вашей системе установлено следующее:

  • Комплект для разработки Java (JDK) 8 или выше
  • Апач Мавен
  • Ваша любимая интегрированная среда разработки или текстовый редактор (например, IntelliJ IDEA, Eclipse или Visual Studio Code)

Настройка проекта:

Для начала мы создадим новый проект Spring Boot с помощью веб-службы Spring Initializr. Откройте терминал и выполните следующую команду:

curl https://start.spring.io/starter.zip -o my-graphql-app.zip

Разархивируйте загруженный файл и импортируйте проект в свою IDE. Теперь добавьте следующие зависимости в файл pom.xml:

<dependencies>
    ...
    <dependency>
        <groupId>com.graphql-java</groupId>
        <artifactId>graphql-java</artifactId>
        <version>17.3</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>11.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>11.0.1</version>
    </dependency>
    ...
</dependencies>

Создание схемы GraphQL:

Создайте новый файл src/main/resources/graphql/schema.graphqls и определите свою схему GraphQL:

type Query {
    getAllBooks: [Book]
    getBook(id: ID!): Book
}

type Mutation {
    createBook(input: BookInput!): Book
}

type Book {
    id: ID!
    title: String!
    author: Author!
}

input BookInput {
    title: String!
    authorId: ID!
}

type Author {
    id: ID!
    name: String!
    books: [Book]
}

Здесь мы определили типы Query и Mutation для нашего API. Мы также определили типы Book, Author и BookInput для нашей модели данных.

Построение модели данных:

Затем создайте классы Java для типов Book и Author:

public class Book {
    private String id;
    private String title;
    private Author author;

    // Constructors, getters, and setters
}

public class Author {
    private String id;
    private String name;
    private List<Book> books;

    // Constructors, getters, and setters
}

Реализация резолверов GraphQL:

Создайте класс Query для реализации преобразователей запросов:

@Component
public class Mutation implements GraphQLMutationResolver {
    private final BookService bookService;

    public Mutation(BookService bookService) {
        this.bookService = bookService;
    }

    public Book createBook(BookInput input) {
        return bookService.createBook(input);
    }
}

Теперь создайте класс BookService для обработки бизнес-логики.

@Service
public class BookService {
    private final Map<String, Book> books = new HashMap<>();
    private final Map<String, Author> authors = new HashMap<>();

    public List<Book> getAllBooks() {
        return new ArrayList<>(books.values());
    }

    public Book getBook(String id) {
        return books.get(id);
    }

    public Book createBook(BookInput input) {
        String id = UUID.randomUUID().toString();
        Author author = authors.get(input.getAuthorId());
        if (author == null) {
            throw new RuntimeException("Author not found");
        }
        Book book = new Book(id, input.getTitle(), author);
        books.put(id, book);
        author.getBooks().add(book);
        return book;
    }
}

Настройка сервера GraphQL:

По умолчанию graphql-spring-boot-starter автоматически настроит для вас сервер GraphQL. Однако вы можете настроить параметры сервера, добавив следующие свойства в файл application.properties:

graphql.servlet.corsEnabled=true
graphql.servlet.mapping=/graphql

Эта конфигурация включает CORS и устанавливает конечную точку GraphQL на /graphql.

Тестирование GraphQL API:

Чтобы протестировать GraphQL API, запустите приложение Spring Boot:

./mvnw spring-boot:run

Откройте браузер и перейдите на игровую площадку GraphQL по адресу http://localhost:8080/graphql. Теперь вы можете протестировать API, используя следующие запросы и мутации:

mutation createAuthor {
  createAuthor(input: { name: "Jane Austen" }) {
    id
    name
  }
}

mutation createBook {
  createBook(input: { title: "Pride and Prejudice", authorId: "1" }) {
    id
    title
    author {
      name
    }
  }
}

query getAllBooks {
  getAllBooks {
    id
    title
    author {
      name
    }
  }
}

query getBook {
  getBook(id: "1") {
    id
    title
    author {
      name
    }
  }
}

Заключение:

В этом руководстве мы узнали, как создать простой API GraphQL с использованием Spring Boot и библиотеки graphql-java. Мы рассмотрели основы проектирования схемы GraphQL, моделирования данных и реализации преобразователей для запросов и мутаций. Демонстрируемый здесь пример проекта может служить отправной точкой для создания более сложных приложений GraphQL с помощью Spring Boot.

Помните, что можно реализовать множество дополнительных функций и оптимизаций, таких как добавление обработки ошибок, кэширование и более продвинутые возможности запросов. Продолжайте изучать экосистему GraphQL, чтобы открывать новые способы улучшения ваших приложений.