JavaRush /Курсы /Модуль 5. Spring /Лекция 284: Создание первого запроса в GraphQL

Лекция 284: Создание первого запроса в GraphQL

Модуль 5. Spring
29 уровень , 3 лекция
Открыта

Сегодня мы сделаем шаг вперёд и создадим наш первый GraphQL-запрос. Рука на мышке, стакан кофе рядом — начинаем!


Создание первого запроса в GraphQL

GraphQL-запросы — это способ получения данных с сервера. В отличие от REST, где каждый эндпоинт возвращает фиксированный набор данных, в GraphQL вы сами описываете структуру ответа. Например, представьте, что вам нужен список пользователей, но только их имена и email'ы. GraphQL позволяет вам запросить только эти поля, что делает ваш API более гибким.

1. Пример запроса GraphQL


query {
  users {
    name
    email
  }
}

Сервер вернёт только эти данные:


{
  "data": {
    "users": [
      { "name": "Иван", "email": "ivan@example.com" },
      { "name": "Анна", "email": "anna@example.com" }
    ]
  }
}

2. Определение схемы GraphQL

Чтобы сервер понимал, какие поля он должен обработать, необходимо создать схему GraphQL. Схема определяет:

  • Какие запросы (queries) поддерживаются.
  • Какие данные возвращаются.
  • Какие типы данных существуют.

Пример схемы GraphQL

Создайте файл schema.graphqls в папке src/main/resources/graphql/. В этом файле укажите схему:


type Query {
    hello: String
    users: [User!]!
}

type User {
    id: ID!
    name: String!
    email: String!
}
  • Query — специальный тип, который описывает все поддерживаемые запросы.
  • hello — простой запрос, возвращающий строку.
  • users — запрос, возвращающий список объектов типа User.
  • User — объект, представляющий пользователя.

3. Добавление данных. Реализация Query Resolvers.

Для обработки запросов GraphQL серверу нужны Query Resolvers. Они описывают, как получать данные для каждого запроса из схемы.

Реализация Query Resolver в Spring Boot

Создайте Java-класс для обработки запросов. Например, QueryResolver:


package com.example.graphql.resolver;

import org.springframework.stereotype.Component;
import com.example.graphql.model.User;

import java.util.List;

@Component
public class QueryResolver {

    // Обработчик запроса "hello"
    public String hello() {
        return "Привет, GraphQL!";
    }

    // Обработчик запроса "users"
    public List<User> users() {
        return List.of(
            new User(1L, "Иван", "ivan@example.com"),
            new User(2L, "Анна", "anna@example.com")
        );
    }
}

Модель User для данных


package com.example.graphql.model;

public class User {
    private Long id;
    private String name;
    private String email;

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Геттеры
    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

Мы создали два обработчика (hello и users), которые отвечают на запросы из нашей схемы GraphQL.


4. Тестирование первого запроса

Время проверить, как работает наш запрос! Для этого можно использовать такие инструменты, как GraphQL Playground, Postman или встроенные плагины в IDE.

Настройка GraphQL Playground

Добавьте следующую зависимость в pom.xml для подключения интерфейса GraphQL Playground:


<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter-playground</artifactId>
    <version>11.1.0</version>
</dependency>

Запустите ваш Spring Boot сервер и перейдите по адресу:


http://localhost:8080/playground

Там вы сможете выполнить запросы и увидеть результат.

Проверка базового запроса

Попробуйте сделать запрос hello:


query {
  hello
}

Должны получить ответ:


{
  "data": {
    "hello": "Привет, GraphQL!"
  }
}

Теперь попробуйте запрос пользователей users:


query {
  users {
    id
    name
    email
  }
}

Результат:


{
  "data": {
    "users": [
      { "id": "1", "name": "Иван", "email": "ivan@example.com" },
      { "id": "2", "name": "Анна", "email": "anna@example.com" }
    ]
  }
}

5. Улучшение структуры с использованием GraphQL Resolver

Чтобы сделать код более структурированным, вы можете использовать аннотации @GraphQLQuery. Это позволяет Spring автоматически связывать запросы GraphQL с методами Java.

Обновлённый Query Resolver


package com.example.graphql.resolver;

import org.springframework.stereotype.Component;
import com.example.graphql.model.User;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;

import java.util.List;

@Component
public class QueryResolver implements GraphQLQueryResolver {

    public String hello() {
        return "Привет, GraphQL!";
    }

    public List<User> users() {
        return List.of(
            new User(1L, "Иван", "ivan@example.com"),
            new User(2L, "Анна", "anna@example.com")
        );
    }
}

Теперь Spring автоматически связывает методы hello и users с запросами описанными в схеме schema.graphqls.


6. Типичные ошибки и их исправление

  • Ошибка "Field 'X' in type 'Query' is undefined"
    • Убедитесь, что схема schema.graphqls определена правильно и соответствует вашим методам в QueryResolver.
  • Ошибка "No resolver found"
    • Проверьте, что ваш класс обработчика аннотирован как @Component и добавлен в контекст Spring.
  • Сервер не отвечает на запросы
    • Убедитесь, что зависимости и конфигурации GraphQL добавлены.

7. Практическое применение

Теперь вы сможете создавать мощные запросы для любых данных в вашем приложении. GraphQL-запросы особенно полезны в клиент-серверных приложениях, где разработчики фронтенда могут запрашивать только нужные данные. Например, мобильные приложения, где время передачи данных особенно критично, выиграют от использования GraphQL.

Подводя итоги:

  1. Вы настроили GraphQL схему.
  2. Создали Query Resolver для обработки запросов.
  3. Протестировали свои первые запросы.

На следующей лекции мы познакомимся с тем, как реализовать мутации (Mutations) для управления данными на сервере.

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Артём Уровень 112
9 октября 2025
Мне кажется, или тут контроллер куда-то потерялся?