Ответ
GraphQL — это язык запросов для API и среда выполнения для этих запросов. Он позволяет клиенту точно описать, какие данные ему нужны, и получить их в одном запросе, решая проблемы избыточной или недостаточной загрузки данных, характерные для REST.
Ключевые отличия от REST:
Характеристика | REST | GraphQL |
---|---|---|
Эндпоинты | Множество эндпоинтов (/users , /posts/:id ) | Обычно один эндпоинт (/graphql ) |
Структура ответа | Определяется сервером | Определяется клиентом в запросе |
Загрузка данных | Часто приводит к over-fetching (лишние данные) или under-fetching (нужно делать доп. запросы) | Клиент получает ровно те данные, которые запросил |
Типизация | Не встроена в стандарт (используются внешние спецификации, как OpenAPI) | Строгая система типов — основа языка. Схема API является контрактом. |
Пример запроса GraphQL:
Клиент хочет получить имя пользователя и заголовки только его постов. Он формирует запрос, точно описывающий нужную структуру:
query GetUserWithPosts {
user(id: "1") {
name
posts {
title
}
}
}
Основные концепции GraphQL:
- Схема (Schema): Определяет все типы данных и операции, доступные в API.
- Запросы (Query): Операции для чтения данных.
- Мутации (Mutation): Операции для изменения данных (создание, обновление, удаление).
- Подписки (Subscription): Позволяют клиентам подписываться на события и получать обновления в реальном времени (например, через WebSockets).
В Go для создания GraphQL-серверов популярны библиотеки gqlgen
и graphql-go/graphql
.