Баннер мобильный (1) Пройти тест

GraphQL

Глоссарий

4 апреля 2023

Поделиться

Скопировано

Содержание

    GraphQL — язык и механизм обработки запросов клиентов к программным интерфейсам приложений. Он разработан компанией Facebook (Meta) (Признана экстремистской организацией и запрещена в РФ) в 2012 году и изначально использовался при работе над мобильным приложением FB. В 2015 году была выпущена первая публичная версия, а c 2018 года дальнейшей разработкой и поддержкой языка, ставшего продуктом с открытым исходным кодом, занимается некоммерческое сообщество GraphQL Foundation. GraphQL создан и развивается как более удобная альтернатива технологии REST. Язык используют в таких программных продуктах, как Airbnb, GitHub, Pinterest, Shopify, New York Times.

    Логотип GraphQL

    Назначение GraphQL

    Язык разработан для оптимизации работы приложений-клиентов с базами данных и доступа к содержащейся в них информации. Ключевое понятие для понимания GraphQL — схема запроса. Это сущность, которая управляет базами данных. Благодаря этому обеспечиваются основные функции языка при работе с данными. Они зашифрованы в аббревиатуре CRUD:

    • Create — создание;
    • Read — считывание;
    • Update — обновление;
    • Delete — удаление.

    GraphQL изначально создавали для работы с большими объемами разнородных данных, хранящихся в разных БД: к примеру, с информацией из профилей пользователей, их интересами, списками посещенных страниц, подписками и подписчиками. Их обработка с помощью классической REST-архитектуры будет сталкиваться с определенными ограничениями и трудностями — в частности, для каждой совокупности данных из одной базы придется создавать отдельный эндпойнт (шлюз, который соединяет серверные процессы приложения с внешним интерфейсом). 

    Особенности GraphQL

    Несмотря на содержание в названии языка слова «graph», он не используется для взаимодействия с графовыми БД. В его основе — вариация классических GET- и POST-запросов. Хотя GraphQL действительно вводит новые механизмы работы с базами данных, в целом его основой остаются традиционные HTML-запросы. 

    Работа с данными идет с помощью двух категорий запросов:

    • на чтение (read) данных — в самом языке их называют «запросы» (querys);
    • на изменение (создание, обновление, удаление) данных (для них применяют термин mutations).

    GraphQL относится к строго типизированным языкам, в нем есть своя система типов. Рассмотрим основные из них. 

    Объектные. Это базовые типы, включающие сам объект и набор его описаний (полей). Например, в приложении по продаже попкорна в кинотеатре это определенный вид воздушной кукурузы и его характеристики (вкус, калорийность, содержание сахара).

    Скалярные. Это группа из нескольких подтипов данных, которые могут содержать только одно неструктурированное значение. К ним относятся:

    • Int (целочисленные) — 32-битное целое число со знаком;
    • Float — число двойной точности с плавающей точкой со знаком;
    • String — строка, закодированная в UTF-8;
    • Boolean (булевы) — логический тип (true или false).

    В GraphQL можно создавать собственные скалярные типы данных, а также добавлять специальные модификаторы, влияющие на валидность полей. 

    Специальные. Это группа подтипов данных для выполнения определенных операций:

    • Аргументы — это именованные пары «ключ-значение», которые определяют, какие данные будут отображаться в конкретном поле после ответа сервера.
    • Перечисления — скалярный тип, содержащий конкретное значение из определенного набора. Например, в примере с попкорном это может быть «вкус», включающий такие значения, как «соленый», «карамельный», «сырный».
    • Интерфейсы — абстрактный тип, представляющий собой набор полей, которые присваивают типу для реализации конкретного интерфейса.

    Запросы и мутации также относятся к специальным типам данных, используемым в GraphQL. Помимо них также применяются подписки (Subscriptions), с помощью которых данные отправляются клиенту, «слушающему» их в реальном времени. В этом случае ответ приходит не единоразово, а каждый раз при создании определенных условий на сервере. 

    Для удобной работы с этими разнообразием данных в GraphQL и предусмотрена схема. По сути, это определенный набор правил реагирования сервера, управляющего базой данных, на запросы клиента. Схема играет роль фильтра, который сортирует пользовательские запросы и выдает на них соответствующие ответы. 

    Взаимодействие клиента и сервера в GraphQL

    Запросы в GraphQL обрабатывает и исполняет стандартный HTTP-сервер с предварительно подготовленной и «присоединенной» к нему схемой. Этот процесс заключается в следующем:

    • Сначала в корневых запросах и мутациях необходимо определить поля. Для этого объявляются применяемые в приложении типы данных (typeDefs) и функции-распознаватели (resolver), обрабатывающие запрос и возвращающие информацию для конкретного поля.
    • Далее пользователь (точнее, программа-клиент) направляет запрос. Сервер обрабатывает его в соответствии с присоединенной к нему схемой и выдает соответствующую структуру данных. 

    В отличие от архитектуры REST, этот процесс не требует наличия нескольких эндпойнтов для каждого источника информации — все данные передаются через один шлюз уже отфильтрованными схемой. То есть клиент (пользователь) получает именно ту информацию, которую он запрашивал. В REST API для выполнения этой задачи потребовалось бы создание или нового эндпойнта под каждый запрос, или одной общей конечной точки с последующей фильтрацией данных уже на стороне самого клиента доступными ему средствами. 

    Преимущества GraphQL

    Клиенториентированность. Обработка запросов происходит не на самой базе данных, а на GraphQL-сервере, к которому можно подключить много различных источников информации. Благодаря этому клиент всегда получает точный ответ на свой запрос независимо от того, откуда взята информация. 

    Производительность и удобство. За счет высокой точности выборки клиент получает только ту информацию, которая требуется ему в данный момент. Это снижает нагрузку как на канал передачи, так и на сам сервер, что особенно полезно в случае приложений, работающих на микросервере с крайне ограниченными возможностями. Это плюс и для мобильных устройств, на небольших экранах которых можно разместить меньше данных, чем на дисплеях десктопов. 

    API-документирование. В GraphQL каждое изменение API автоматически документируется. Это достигается за счет тесной связи кода с API-интерфейсом. Благодаря этому разработчикам не приходится тратить много времени на документирование, при этом сохраняется возможность быстро посмотреть историю изменений. 

    Развитие API без контроля версий. Раньше до перехода на новую версию API разработчикам приходилось сохранять старую. В GraphQL можно отказываться от устаревшего API на уровне полей. Неактуальные поля позже удаляют из схемы, что не оказывает влияния на действующие запросы. Вместо нескольких API создается один для всего приложения, которое задействует несколько разных способов хранения данных.

    Подробное документирование ошибок. В REST ошибки ищут путем проверки ответа сервера на HTTP-заголовки. Исходя из него разработчик уже сам определяет, что пошло не так, чем это вызвано и как исправить баг. В GraphQL каждая ошибка подробно документируется сервером с указанием распознавателя и конкретного фрагмента запроса. Разработчик может сам выбрать, в каком виде ему удобнее принимать информацию: текстом, трассировкой стека или кодом ошибки. 

    Большое комьюнити. GraphQL — это ПО, которое свободно распространяют, поэтому вокруг него сформировалось достаточно широкое сообщество профессионалов и энтузиастов-любителей. Они выпускают туториалы и обучающие материалы по работе с этим языком, создают дополнения, исправляющие его недостатки. То есть разработчик, который решил освоить GraphQL, может в любой момент обратиться за помощью и наверняка найдет ответ на свой вопрос. 

    Недостатки GraphQL

    Снижение производительности запросов. С одной стороны, GraphQL позволяет получить точный ответ на запрос. Это снижает нагрузку на канал и сервер. С другой, если запрос составлен слишком широко, придется получить и обработать данные с тысяч ресурсов. Это серьезно замедляет работу приложения. 

    Дублирование кода. В процессе сборки бэкэнда с помощью GraphQL приходится создавать 2 схемы: одну для баз данных, вторую для конечной точки. У них много общего, но они не идентичны. Поэтому разработчику приходится часто писать и синхронизировать повторяющийся код, что усложняет работу. Этот недостаток можно обойти с помощью расширений, которые разрабатывает сообщество GraphQL.

    Таким образом, GraphQL не абсолютно универсальный инструмент для обмена данными между приложением и БД. В некоторых случаях более простым и рациональным решением будет использование REST. В то же время этот язык позволяет минимизировать количество клиентских запросов, оптимизировать работу над пользовательским интерфейсом и обеспечить нормальное взаимодействие нескольких приложений с различными источниками данных.

    Поделиться

    Скопировано

    0 комментариев

    Комментарии