Что такое GraphQL?
GraphQL стандартизированный «API Gateway». Транспорт данных клиент-сервер может выполнятся с помощью любого протокола (http, ssh, ws, cli, etc.).
Более детально:
GraphQL — это стандарт, декларирования структуры данных и методов получения данных, который размещается дополнительным слоем между клиентом и сервером.
Одной из основных особенностей GraphQL является то, что структура и объем данных определяется клиентской частью приложения.
Простой пример запроса пользователя:
Клиентская часть указывает, что данные он хочет получить, используя декларативную, графоподобную структуру, похожей на формат JSON.
Клиент запрашивает три поля (name, email и age). Так же он может запрашивать как одно поле, к примеру name, так и произвольное количество, смотря что определенно в типе user на GraphQL в серверной части.
GraphQL облегчает агрегацию данных из нескольких источников.
Пример простой клиент-серверной архитектуры.
У каждого клиентского приложения есть сервер. Трансляция данных выглядит просто,
не важно, какой именно протокол передачи данных для этого используется. В случае http посылается запрос и получается ответ.
GraphQL является прослойкой между клиентом и сервером, (пример расположения в структуре),
Если добавить еще один сервис, можно увидеть, что все проходит через него
Сервисы для него могут быть написанными на разных языках программирования, взаимодействовать с разными базами данных, Sql или NoSql, могут иметь разные API. Но работать при такой архитектуре становиться довольно сложно, а добавление каждого нового сервиса требует много ресурсов.
GraphQL стандартизированный «API Gateway». Транспорт данных клиент-сервер может выполнятся с помощью любого протокола (http, ssh, ws, cli, etc.).
Клиент запрашивает ресурсы у GraphQL сервера используя GraphQL запрос. GraphQL сервер анализирует запрос, рекурсивно проходит по графу и выполняет для каждого поля его «resolver» функцию. Когда все данные по запросу будут собраны, GraphQL сервер вернет ответ.
Система типов
GraphQL использует систему типов для описания данных.
В GraphQL поля могут быть представлены как базовыми, так и пользовательскими типами. В данном примере поле user представлено пользовательским типом User. У типа User описан набор полей, которые представлены базовыми типами.
Таким образом и реализуется графо-подобная структура неопределенного уровня вложенности.
Сравнение GraphQL API и REST API
- Зависимость от протокола передачи данных.
GraphQL не зависит от протокола передачи данных, может использовать любой (http, ws, ssh, cli, etc.)
REST базируется на http протоколе, и зависит от него. - Единая точка входа. ( Entry point )
В GraphQL для работы с данными мы всегда обращаемся к единой точке входа — GraphQL серверу. Изменяя структуру, поля, параметры запроса мы работаем с разными данными.
В REST API каждый путь (route) представляет собой отдельную точку входа. - Возможность возвращать разные форматы данных.
GraphQL может возвращать только JSON формат.
REST в данном случае более гибкий. REST API может возвращать данные в различных форматах — JSON, XML и т.д., это зависит от заголовков http запроса, и от самой имплементации API. - Декларация, документация, инструменты разработки
GraphQL дает возможность написания документации непосредственно в коде (inline documentation).В GraphQL может описать любой созданный тип, для этого при создании типа нужно в поле «description» описать, для чего данный тип нужен. Данную документацию могут подгружать различные утилиты, IDE, что очень упрощает работу с GraphQL.
В GraphQL из коробки имеет свой IDE, который работает в браузере и называется GraphiQL.
GraphiQL хранит историю запросов, подсвечивает синтаксис, подсказывает поля, которые можно запросить у текущего типа, подгружать документацию.
GraphiQL можно включить через конфигурацию GraphQL, с помощью настройки graphiql = true и перейдя по пути <имя домена>/graphiql. Либо же можно использовать одно из расширений для браузера, которые имеют практически одинаковую функциональность но разный UI.
REST не имеет подобной функциональности, но есть возможность её реализовать используя SWAGGER.
- Возможность формировать структуру и объем данных на клиенте
Основная особенность GraphQL, формат и структура данных определяется на стороне клиента. В REST формат и структура данных жестко определены на сервере.
- Передача аргументов в запрос
GraphQL — это единая точка входа то в GraphQL, в которой имеется возможность передать аргументы на любой уровень вложенности.В REST каждый путь представлен как отдельная точка входа, в таком случае передать аргументы можно только для всего запроса.