Что такое GraphQL
GraphQL — это язык запросов и серверная среда выполнения для интерфейсов прикладного программирования (API), которая предоставляет клиентам API именно те данные, которые они запрашивали. GraphQL позволяет выполнять запросы на получение данных из нескольких источников с помощью одного вызова API. Инструмент разработан для того, чтобы сделать API быстрыми, гибкими и удобными для разработчиков.
GraphQL предоставляет возможность гибко добавлять или удалять поля, не затрагивая существующие запросы. Разработчики могут создавать API как им хочется, а спецификация гарантирует предсказуемое поведение API для клиентов. Сервис также может быть развернут в интегрированной среде разработки (IDE) под названием GraphiQL.
Подробнее рассмотрим Rest API. REST API или RESTful API — это программный интерфейс, который соответствует требованиям архитектурного стиля REST. API-интерфейсы предоставляют свои функциональные возможности в виде ресурсов в архитектуре REST, которые могут быть любыми сервисами, данными или объектами. Каждый ресурс имеет собственный URI (единый идентификатор ресурса), который клиент может получить, отправив запрос на сервер.
Когда была изобретена концепция REST, клиентские приложения были относительно простыми, а скорость разработки была не такой высокой, как сейчас. Раньше REST был подходящим для многих проектов. Но в последние годы среда API изменилась. Чтобы учесть эти изменения, в 2015 году был разработан GraphQL. Этот проект с открытым исходным кодом придумали в Facebook, но в 2018 году компания передала сервис холдингу GraphQL Foundation.
Как работает GraphQL
GraphQL состоит из нескольких компонентов, каждый из которых играет важную роль в обработке данных. В его состав входят:
- schemas (схемы),
- resolvers (преобразователи),
- queries (запросы),
- mutations (мутации).
Схемы. GraphQL использует строгую систему типов, в которой все типы данных записываются на языке определения схем GraphQL (SDL). Типизированные схемы определяют формы данных, которые могут запрашиваться в API, а также взаимосвязи между типами и операциями, доступными пользователю.
Другими словами, они определяют возможности API и форму данных, с которыми клиенты могут взаимодействовать. Конфигурация этой схемы в итоге определяет, как можно использовать API. По мере поступления запросов схема используется для проверки запросов, а GraphQL выполняет только выборочные из них.
Преобразователи. Каждое поле в схеме поддерживается преобразователем, который заполняет данные и определяет реакцию на набор полей. Он может извлекать информацию из базы данных, облачного сервиса или из другого источника.
При запуске поля запроса система генерирует вызов соответствующего преобразователя для получения следующего значения. Если поле выдает скалярное значение (например, строку или число), выполнение завершается. Если оно содержит объектное значение, запрос включает дополнительные значения для этого объекта. Этот процесс продолжается до тех пор, пока не останутся только скалярные поля. Преобразователи также упрощают форматирование информации и помогают системе объединять информацию из различных источников.
Запросы. Их отправляют клиенты на сервер. Он определяет, какие данные клиент хочет получить. Запросы определяются в типе, который представляет собой специальный объект в коде, определяющий точку входа верхнего уровня для каждого запроса, который клиенты могут выполнять. Каждый тип запроса также определяет имя и вид возвращаемого значения для каждой точки входа.
Когда поступает запрос, GraphQL проверяет его на соответствие определениям схемы и, предполагая, что запрос корректен, выполняет его. Структура обычно отражает структуру данных ответа, что делает требования к виду информации более понятными.
Мутации. Это операции, которые создают, обновляют или удаляют данные на сервере. Они аналогичны операциям POST, PUT, PATCH и DELETE в RESTful API. Хотя пользователи могут получать доступ к некоторым запросам без аутентификации, мутации всегда требуют ее наличия (например, с помощью токена). Аналогично запросам, мутации в GraphQL проверяются на соответствие схеме и ее определениям. Как только мутация проверена и запущена, сервер возвращает ответ в формате JSON (текстовый формат на JavaScript).
В чем преимущества GraphQL
Скорость. GraphQL работает намного быстрее, чем другие коммуникационные API. Он позволяет сократить количество запросов, выбирая только нужные поля.
Совместимость со сложными системами и микросервисами. Сервер инструмента используется для получения данных из существующих систем и представления их в формате ответов. Это наиболее подходящий формат для устаревших инфраструктур или сторонних API, которые огромны по размеру и сложны в обслуживании и обработке. Когда нужно переходить от монолитного серверного приложения к архитектуре микросервисов, GraphQL помогает управлять взаимодействием между несколькими микросервисами. Он объединяет их в одну схему.
Отсутствие проблем с избыточной или недостаточной выборкой данных. Ответы REST иногда содержат слишком много лишней информации, а иногда ее недостаточно. Из-за этого нужного создавать повторные запросы. В GraphQL эта проблема решена. Инструмент извлекает только точные и выборочные данные в одном запросе.
Определение формы данных. При отправлении запросов сервер возвращает ответ в простой, безопасной и предсказуемой форме. Это облегчает написание конкретного запроса в соответствии с требованиями.
Строгая типизация. GraphQL — это язык со строгой типизацией, в котором каждый уровень запроса соответствует определенному типу. А каждый тип описывает набор доступных полей. Он похож на SQL и предоставляет описательные сообщения об ошибках перед выполнением запроса.
Нет необходимости в обновлении. В GraphQL результирующий набор или возвращаемые данные очень специфичны в соответствии с запросом клиента, поэтому серверу просто их обобщить. Добавление новых функций продукта или полей на сервер не влияет на работу существующих клиентов. Можно использовать старый сервер — поля могут быть устаревшими, но при этом будут продолжать работать.
Примеры функциональности
При отправке запросов к вашему API GraphQL возвращает очень предсказуемый результат без какой-либо избыточной или недостаточной выборки, гарантируя, что приложения, использующие GraphQL, будут быстрыми, стабильными и масштабируемыми.
Подписки — это то, что GraphQL использует для доставки обновлений в режиме реального времени с сервера подписанным клиентам. Это похоже на использование Socket.io для настройки взаимодействия в режиме реального времени между сервером и интерфейсом. В GraphQL это встроено в функциональность. Подписки на GraphQL создаются в основном для просмотра создания данных на сервере, их обновления, удаления или считывания с помощью запроса. Генерируемое событие зависит от того, что хочет разработчик. События передаются с сервера подписавшимся клиентам.
Клиенты подписываются на событие на стороне сервера с помощью запроса:
subscription NewsFeed {
newsCreated {
title
body
}
}
Это подписка для поля newsCreated. Приведенный выше запрос отправляется через WebSocket на сервер GraphQL, запрос устанавливает событие на сервере с функцией обратного вызова распознавателя. Всякий раз, когда на сервере GraphQL генерируется событие, вызывается функция распознавания, а возвращаемое значение отправляется в запрос подписки.
Предположим, что мы хотим добавить подписку, чтобы получать уведомления о добавлении новости в базу данных. Начнем с определения типа подписки в схеме.
type Subscription {
newNewsItem(id: String): NewsItem
}
Нужно создать средство распознавания для поля newNewsItem. Теперь средства распознавания для подписки отличаются от средств распознавания для запросов и мутаций. Средство распознавания подписки — это объект, который будет обладать свойствами функций разрешения и подписки. Функция subscribe должна возвращать объект типа AsyncIterator:
Subscription: {
newOrder: {
resolve: (payload) => {
return payload.newNewsItem;
},
subscribe: () => {
return pubsub.asyncIterator("NEW_NEWSITEM");
},
},
}
Функция subscribe вызывается, когда запрос на подписку выполняется на стороне клиента. PubSub, как объект взят из библиотеки apollo-server-express. Он позволяет публиковать события для метки, а также изучать события, связанные с меткой. В целом, PubSub — это базовый источник событий, который позволяет генерировать события.
Советы по работе с GraphQL
Обеспечение согласованности имен в схеме. Согласованное именование в схемах GraphQL упрощает и повышает эффективность идентификации данных. Если разработчик не настроил наименование схемы и не придерживается определенного стандарта, в одной и той же схеме можно найти разные имена или свойства, которые ссылаются на одни и те же данные. Это может вызвать проблемы при дальнейших действиях.
Отказ от жестко заданных аргументов. Лучше избегать жестко заданных параметров, которые встраивают данные прямо в исходный код. Они добавляют все, включая конфиденциальные данные, в строки запроса. В результате важная информация может стать доступной для взломщиков. Помимо очевидных рисков для конфиденциальности, связанных с жестко заданными параметрами, также возникают проблемы с кэшированием. При попытке кэшировать запросы API жестко заданные параметры могут занимать много места и снижать общую производительность.
Удаление нелогичных фрагментов. В GraphQL фрагменты — это логические элементы, которые могут использоваться одновременно для запросов и мутаций. Фрагменты помогают сделать каждый запрос коротким, удобочитаемым и последовательным. Но при неправильном использовании некоторые фрагменты могут принести больше вреда, чем пользы. Один из способов убедиться в необходимости всех фрагментов — использовать их только в тех полях схемы, которые имеют логическое значение. Неправильное или нелогичное добавление фрагментов может привести к обратному эффекту и затруднить чтение запроса.