Gernar
HTTP, API и сеть

Что такое GraphQL схема

Разбор вопроса «Что такое GraphQL схема» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Что такое GraphQL схема

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет услышать, что кандидат понимает роль GraphQL схемы в описании структуры данных, знает основные компоненты схемы (Query, Mutation, Subscription) и умеет объяснить, как она используется для валидации и выполнения запросов.

Ключевые тезисы

  • GraphQL схема — это описание структуры данных, которые могут быть запрошены через API.
  • Она определяет типы данных (например, объекты, скаляры), их поля и отношения между ними.
  • Схема включает корневой тип Query для получения данных, Mutation для их изменения и Subscription для работы с реальными обновлениями.
  • Схема может быть описана с помощью языка схем GraphQL Schema Definition Language (SDL).
  • Схема также включает директивы для настройки поведения запросов и валидации данных.

Подробный ответ

GraphQL схема — это основа любого GraphQL API. Она определяет структуру данных, которые могут быть запрошены или изменены через API. Схема описывает типы данных, их поля и отношения между ними, а также операции, которые клиент может выполнять: запросы (Query), изменения (Mutation) и подписки (Subscription). Схема создается с использованием языка GraphQL Schema Definition Language (SDL), который предоставляет удобный синтаксис для описания типов и их полей. Например, схема может включать скалярные типы (String, Int, Boolean), объектные типы (User, Post) и специальные типы (Query, Mutation).

Корневой тип Query определяет начальную точку для запросов данных. Например, если у вас есть тип User, вы можете определить поле users в корневом типе Query, чтобы клиенты могли запрашивать список пользователей. Аналогично, тип Mutation используется для операций, изменяющих данные (например, создание, обновление или удаление). Подписки (Subscription) позволяют клиентам получать обновления в реальном времени.

Директивы в GraphQL — это инструменты для настройки поведения запросов и валидации данных. Например, @deprecated указывает, что поле больше не рекомендуется к использованию, а @skip или @include позволяют динамически включать или исключать поля из запроса. Схема также обеспечивает валидацию запросов: если клиент запрашивает поле, которого нет в схеме, сервер вернет ошибку.

Практические примеры

Пример 1

Пример определения простой GraphQL схемы для блога:

type Query {
  posts: [Post]
  post(id: ID!): Post
}

type Mutation {
  createPost(title: String!, content: String!): Post
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User!
}

type User {
  id: ID!
  name: String!
  email: String!
}

Здесь определены типы Post и User, а также корневые типы Query и Mutation для запросов и изменений данных.

Пример 2

Пример использования директив в запросе:

query GetPost($id: ID!, $withAuthor: Boolean!) {
  post(id: $id) {
    title
    content
    author @include(if: $withAuthor) {
      name
      email
    }
  }
}

Директива @include позволяет динамически включать поле author в ответ, если переменная $withAuthor равна true.

Частые ошибки

  • Ошибка: Неправильное определение обязательных полей. Например, забыть добавить ! к типу поля, что может привести к неожиданным null в ответах.
  • Ошибка: Использование слишком сложных или вложенных типов без необходимости, что усложняет схему и затрудняет ее понимание.

Связанные темы

  • REST API и его сравнение с GraphQL
  • Асинхронные запросы в GraphQL (Apollo Client, Relay)
  • Типы в TypeScript и их использование с GraphQL

Follow-up вопросы

Какие основные типы данных поддерживаются в GraphQL схеме?

Уровень: basic

GraphQL поддерживает скалярные типы (например, Int, Float, String, Boolean, ID), объектные типы (пользовательские структуры данных), перечисления (Enum), списки и не-null типы.

Как определить корневой тип Query в GraphQL схеме?

Уровень: intermediate

Корневой тип Query определяется как объект, который содержит поля для запросов данных. Например, type Query { getUser(id: ID!): User }, где getUser — это поле для получения пользователя.

Что такое директивы в GraphQL и как они используются?

Уровень: intermediate

Директивы — это аннотации, которые изменяют поведение запросов или полей. Например, @include(if: Boolean) позволяет включать поле в запрос при выполнении условия, а @skip(if: Boolean) — пропускать его.

Как работает валидация запросов на основе GraphQL схемы?

Уровень: advanced

GraphQL схема используется для валидации запросов: проверяется соответствие запроса типам и полям, определенным в схеме. Если запрос не соответствует схеме, возвращается ошибка.

В чем отличие между GraphQL и REST API с точки зрения схемы данных?

Уровень: advanced

GraphQL использует строго типизированную схему, которая описывает все доступные данные и их структуру, тогда как REST API не имеет явной схемы и опирается на эндпоинты для доступа к данным.

Содержание