GraphQL
GraphQL — язык запросов и манипулирования данными, позволяющий явно указывать, какие данные требуется получить («декларативное получение данных») или изменить.
Сервер GraphQL может обрабатывать запрос клиента, используя данные из различных источников, и представлять результат в виде единого графа. Язык не привязан к какой-либо конкретной базе данных или механизму хранения. Существует несколько открытых исполняемых сред для GraphQL.
Общие сведения
| GraphQL | |
|---|---|
| Тип | graph query language |
| Автор | Meta Platforms |
| Разработчик | The GraphQL Foundation |
| Написана на | реализации на Java, JavaScript, Ruby, Scala и других языках |
| Первый выпуск | 14 сентября 2015 |
| Последняя версия | October 2021 |
| Репозиторий | github.com/graphql/graph… |
| Сайт | graphql.org |
История
Facebook начал разработку GraphQL в 2012 году и опубликовал черновой стандарт и эталонную реализацию с открытым исходным кодом в 2015 году[1]. В 2018 году проект GraphQL был передан в специально созданный фонд GraphQL Foundation, который управляется некоммерческим консорциумом Linux Foundation[2][3].
9 февраля 2018 года язык определения схемы GraphQL был включён в спецификацию[4].
Многие крупные открытые API внедрили GraphQL в качестве основного интерфейса доступа. Среди них публичные API Facebook, GitHub, Yelp, Shopify, Google Directions API и другие[5][6].
Архитектура и принципы работы
GraphQL поддерживает чтение, изменение (мутация) и подписку на изменения данных (режим реального времени, часто реализуется через WebSocket)[7]. Сервис GraphQL создаётся путём описания типов с их полями и предоставления функций для получения данных для каждого поля. Эти типы и поля формируют так называемое описание схемы (schema definition). Функции, которые возвращают и сопоставляют данные, называются резолверами[8].
После валидации против схемы, запрос GraphQL исполняется сервером. Результат возвращается в структуре, повторяющей форму исходного запроса, обычно в виде JSON[9].
Система типов
С помощью GraphQL предметная область моделируется в виде графа путём определения схемы: в ней задаются различные типы узлов и их отношения друг с другом[10].
Система типов определяет, какие данные могут быть запрошены через API. Совокупность таких возможностей называется схемой сервиса, а клиенты могут использовать схему для отправки предсказуемых запросов[11].
Корневой тип схемы, по умолчанию Query, содержит все доступные для запроса поля. Другие типы определяют объекты и поля, которые сервер GraphQL может вернуть. Выделяются базовые типы, так называемые скалярные, для представления строк, чисел, идентификаторов и др.
Поля по умолчанию допускают отсутствие значения (nullable), а восклицательный знак после типа делает поле обязательным (not-null). Для обозначения списка тип оборачивается в квадратные скобки, например: authors: [String][12]:
type Query {
currentUser: User
}
type User {
id: ID!
name: String!
}Запросы (queries)
Запрос в GraphQL явно определяет форму (структуру) требуемых данных.
query CurrentUser {
currentUser {
name
age
}
}После проверки и выполнения сервером данные возвращаются в той же структуре.
{
"currentUser": {
"name": "John Doe",
"age": 23
}
}
Мутации (mutations)
Мутация в GraphQL позволяет создавать, изменять или удалять данные. Обычно при мутациях используются переменные, чтобы параметры операции поступали с клиента. В мутации также указывается структура возвращаемого результата.
mutation CreateUser($name: String!, $age: Int!) {
createUser(userName: $name, age: $age) {
name
age
}
}Переменные передаются объектом, содержащим поля с соответствующими именами:
{
"name": "Han Solo",
"age": 42
}
После выполнения операции сервер возвращает данные в описанной структуре:
{
"data": {
"createUser": {
"name": "Han Solo",
"age": 42
}
}
}
Подписки (subscriptions)
GraphQL также поддерживает режим подписки: сервер может отправлять клиенту актуальные изменения данных. Как и в других операциях, клиент определяет структуру необходимых данных при каждом обновлении.
subscription {
newPerson {
name
age
}
}При выполнении соответствующей мутации подписанные клиенты получают новые данные в указанном формате:
{
"newPerson": {
"name": "Jane",
"age": 23
}
}
Версионирование
Хотя ничто не мешает внедрять версионирование GraphQL API так же, как и других API, сам подход GraphQL акцентируется на непрерывном развитии схемы без выделения версий[13].
Встроенная директива @deprecated используется для пометки устаревших полей и значений в определении схемы[12].
GraphQL возвращает только явно запрошенные поля, поэтому новые возможности легко добавлять новыми типами или полями, избегая критических изменений. На практике сложился подход его использования без версионности[13].
Тестирование
GraphQL API могут тестироваться вручную либо с помощью автоматизированных инструментов, которые выполняют запросы и проверяют корректность результатов. Также возможна автоматическая генерация тестов[14]. Благодаря типизированной схеме и возможностям интроспекции тестовые запросы можно генерировать поисковыми методами[15].
Среди популярных инструментов для тестирования реализации GraphQL — Postman, GraphiQL, Apollo Studio, GraphQL Hive, GraphQL Editor и Step CI[16]. Также существует сервис Hive Laboratory[17].
Примечания
- ↑ GraphQL: A data query language (англ.) (14 сентября 2015). Дата обращения: 17 мая 2023. Архивировано 5 июля 2018 года.
- ↑ Facebook's GraphQL gets its own open-source foundation (англ.), TechCrunch. Архивировано 21 июня 2025 года. Дата обращения: 7 ноября 2018.
- ↑ The Linux Foundation Announces Intent to Form New Foundation to Support GraphQL (англ.), The Linux Foundation (6 ноября 2018). Архивировано 7 июля 2025 года. Дата обращения: 17 марта 2023.
- ↑ GraphQL SDL included in Github repository. GitHub. Архивировано 9 февраля 2018 года.
- ↑ GraphQL Landscape. landscape.graphql.org (5 июля 2025).
- ↑ graphql-kit/graphql-apis. graphql-kit (31 мая 2025). Дата обращения: 5 июня 2025. Архивировано 6 августа 2025 года.
- ↑ GraphQL. facebook.github.io. Facebook. Дата обращения: 4 июля 2018. Архивировано 18 июля 2018 года.
- ↑ Introduction to GraphQL. graphql.org. Дата обращения: 25 апреля 2023. Архивировано 17 сентября 2016 года.
- ↑ Execution. graphql.org. Дата обращения: 25 апреля 2023. Архивировано 23 сентября 2025 года.
- ↑ Thinking in Graphs (англ.). graphql.org. Дата обращения: 3 июня 2025. Архивировано 1 октября 2025 года.
- ↑ Schemas and Types (англ.). graphql.org. Дата обращения: 3 июня 2025. Архивировано 10 октября 2025 года.
- ↑ 1 2 GraphQL. spec.graphql.org. Дата обращения: 25 апреля 2023. Архивировано 27 октября 2021 года.
- ↑ 1 2 Schema Design (англ.). graphql.org. Дата обращения: 3 июня 2025. Архивировано 18 декабря 2024 года.
- ↑ Vargas, D. M.; Blanco, A. F.; Vidaurre, A. C.; Alcocer, J. P. S.; Torres, M. M.; Bergel, A.; Ducasse, S. (2018). “Deviation Testing: A Test Case Generation Technique for GraphQL APIs” (PDF). 11th International Workshop on Smalltalk Technologies (IWST): 1—9.
- ↑ Karlsson, Stefan. Automatic Property-based Testing of GraphQL APIs // 2021 IEEE/ACM International Conference on Automation of Software Test (AST) / Stefan Karlsson, Adnan Causevic, Daniel Sundmark. — Мадрид, Испания : IEEE, May 2021. — P. 1–10. — ISBN 978-1-6654-3567-3. — doi:10.1109/AST52587.2021.00009.
- ↑ GraphQL IDE Monorepo. GraphQL (25 апреля 2023). Дата обращения: 25 апреля 2023. Архивировано 1 октября 2025 года.The Apollo Studio Explorer. Apollo Docs. Дата обращения: 25 апреля 2023. Архивировано 28 мая 2023 года.GraphQL Editor API Console. GraphQL Editor Docs. Дата обращения: 2 сентября 2023. Архивировано 1 октября 2025 года.Testing GraphQL APIs. Step CI Documentation. Дата обращения: 8 января 2023. Архивировано 1 октября 2025 года.
- ↑ Hive Laboratory. Hive Documentation. Дата обращения: 26 ноября 2024. Архивировано 27 августа 2025 года.