Сегодня мы сделаем шаг вперёд и создадим наш первый 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.
Подводя итоги:
- Вы настроили GraphQL схему.
- Создали Query Resolver для обработки запросов.
- Протестировали свои первые запросы.
На следующей лекции мы познакомимся с тем, как реализовать мутации (Mutations) для управления данными на сервере.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ