Самый распространённый стандарт для обмена информацией внутри приложений — это REST API. Его все любят, но знают, что он не идеален. В этой статье обсудим его альтернативу — GraphQL. Мы расскажем, в чём преимущество GraphQL, как выглядят запросы и с чего начать.

Зачем был создан GraphQL, если уже есть REST

Есть две основные причины, по которым Facebook, Netflix и Coursera начали разрабатывать альтернативу REST:

  1. В начале 2010-х годов наблюдался бум использования мобильных устройств, что привело к некоторым проблемам с маломощными устройствами и неаккуратными сетями. REST не оптимален для решения этих проблем.

  2. По мере роста использования мобильных устройств росло количество различных фронтенд-фреймворков и платформ, на которых работают клиентские приложения. Учитывая негибкость REST, было сложнее разработать единый API, который мог бы соответствовать требованиям каждого клиента.

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

Вследствие этого Facebook начал разработку GraphQL. В то же время Netflix и Coursera сами работали над альтернативными вариантами. После того, как Facebook выложил GraphQL в открытый доступ, Coursera прекратила свои усилия и перешла на новую технологию. Netflix, однако, продолжил разработку собственной альтернативы REST, а позже открыл исходный код Falcor.

Что такое GraphQL

GraphQL — это язык, используемый API для запроса информации из БД. Считается, что это промежуточный слой, поскольку данные затем могут быть отображены на внешней веб-странице. Ключевой момент здесь то, что GraphQL — это язык запросов для API. Обратите внимание на слово «API». Важно знать, что GraphQL — это не язык запросов к базам данных. Это распространённое заблуждение, вызывающее много споров. Цель GraphQL — быть языком запросов, позволяющим разработчикам собирать только те данные, которые им нужны в конкретный момент, и ничего кроме. А также стремиться сократить и оптимизировать время выполнения запросов.

GraphQL реализует систему, определяющую схему API, которая использует синтаксис языка определения схем (SDL). Это означает, что в рамках его синтаксиса можно создавать обязательные поля, строить таблицы в графовом виде или даже определять отношения между двумя таблицами.

Пример запроса (# - это комментарий) :

# В запросе мы указываем необходимые поля, которые хотим получить. 
# Исходная модель данных позволяет выбрать большой объём информации, 
# который не нужен для текущей работы
query{
  # Имя вызываемой функции. 
  # В данном случае — получение — мы можем получить авторов и всё, что с ними связано
  authors{
    # Поле уникального идентификатора
    id
    # Имя автора
    name
    # Книги автора
    books{
      # Поле уникального идентификатора книги
      id
      # Заголовок книги
      title
      # Идентификатор ISBN 10
      iSBN_10
      # Подробная информация о книге
      details{
        # Язык
        language
        # Разрешённый возраст
        readingAge
        # Отзывы
        reviews
      }
    }
  }
}

Каких-то ограничений моделей при работе практически нет. В отличии от REST, GraphQL уже содержит схему данных без всяких внешних стандартов, например, OpenAPI для REST. И схема GraphQL гораздо функциональнее.

Сравнение GraphQL с REST

Если говорить о сходстве, то и REST, и GraphQL используются для построения API. Кроме того, оба они могут управляться через HTTP.

Примечательно, что ситуация с GraphQL и REST полностью идентична ситуации с реляционными и NoSQL базами данных пару лет назад.

При использовании GraphQL HTTP, безусловно, предпочтительный вариант клиент-серверного протокола, и это в основном из-за его повсеместного распространения. Однако производительность вызывает сомнения, когда речь идёт об обслуживании по HTTP/2.

Что касается различий, то REST в первую очередь является структурной концептуализацией для сетецентрического программного обеспечения, не имеет спецификации и определённого набора инструментов. Он больше сосредоточен на долговечности API, чем на оптимизации производительности.

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

1.Различие в получении данных и их структуре

Получение данных — это, безусловно, одно из самых интересных достижений GraphQL. В стандартном REST API, чтобы получить или восстановить данные, нам может потребоваться сделать запросы к многочисленным эндпоинтам. GraphQL же предлагает один эндпоинт, через который мы получаем доступ к данным, доступным на сервере. 

В нашем примере это эндпоинт /author/{idAuthor} для получения исходных данных о авторе. 

Вероятно, так же будет конечная точка /author/{idAuthor}/book/{idBook}, которая возвращает конкретную книгу автора.

С другой стороны, в GraphQL вы просто отправляете один запрос на сервер GraphQL, который включает конкретные требования к данным. Затем сервер отвечает объектом JSON, в котором эти требования выполнены.

2.Использование шаблонов проектирования

GraphQL разделяет свои типы API-запросов на запросы и мутации. Запрос не изменяет состояние данных и просто возвращает результат. Мутация, с другой стороны, изменяет данные на стороне сервера. Таким образом, для CRUD-операций мы будем использовать запрос для чтения и мутацию для создания, обновления или удаления.

Подход CRUD в своей основе повторяет простейшие операции с базой данных:

create, read, update, delete. В GraphQL мы не ограничены только этим подходом, хотя легко можем его реализовать:

/// <summary>
/// Запрос чтения
/// </summary>
/// <param name="ctx">Контекст базы данных Entity</param>        	
/// <returns>Авторы</returns>    	
[UseDbContext(typeof(DemoContext))]
[UseProjection]
[UseFiltering()]
[UseSorting()]
public IQueryable<Author> Authors([ScopedService] DemoContext ctx)
{
	return ctx.Authors;
}


/// <summary>
/// Создание автора
/// </summary>
/// <param name="author">Создаваемый автор</param>
/// <param name="ctx">Контекст базы данных Entity</param>
/// <returns>Автор</returns>    	
public Author Create(Author author, [Service] DemoContext ctx)
{
  ctx.Add(author);
  ctx.SaveChanges();
  return author;
}
#endregion

/// <summary>
/// Обновление автора
/// </summary>
/// <param name="author">Обновляемый автор</param>
/// <param name="ctx">Контекст базы данных Entity</param>
/// <returns>Автор</returns>    	
public Author Update(Author author, [Service] DemoContext ctx)
{
  ctx.Update(author);
  ctx.SaveChanges();
  return author;
}

/// <summary>
/// Удаление автора
/// </summary>
/// <param name="id">Уникальный идентификатор автора</param>    	
/// <param name="ctx">Контекст базы данных Entity</param>
/// <returns>Автор</returns>    	
public Author Delete(int id, [Service] DemoContext ctx)
{
  var author = ctx.Authors.FirstOrDefault(a => a.Id == id);
  
  if (author == null)
    throw new ArgumentException("Автор не найден");
  
  ctx.Remove(author);
  ctx.SaveChanges();
  return author;
}

3.Авторизация и аутентификация

Рассматривайте GraphQL как специфичный язык. Это всего лишь один слой, который мы можем поместить между сервисом данных и нашими клиентами. Авторизация — это совершенно отдельный слой, и сам язык не поможет в применении или использовании верификации или аутентификации. Однако вы можете использовать GraphQL для связи токенов входа между клиентами и действующим планом. Это совершенно идентично подходу, которому мы следуем в REST.

Получение token-авторизации может выглядеть так:

На примере .NET Core backend (C#) достаточно в раздел ConfigureServices добавить:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, config =>
        {
            config.TokenValidationParameters = new TokenValidationParameters
            {
                ClockSkew = TimeSpan.FromSeconds(5),
                ValidateAudience = false
            };                        
            config.RequireHttpsMetadata = false;
            // Сервер OAUTH 2.0 
            config.Authority = "http://localhost:8080/auth/realms/SAT/";
            // Проверка для проекта
            config.Audience = "DEMO";
        });

Для того, чтобы функция использовала авторизацию, достаточно добавить:

 /// <summary>
 /// Тестовая функция с авторизацией
 /// </summary>
 /// <param name="claimsPrincipal"></param>
 /// <returns></returns>
 [Authorize(Roles = new[] { "admin" })]    	
 public bool AuthorizeQuery([Service] IHttpContextAccessor context, ClaimsPrincipal claimsPrincipal)
 {
 var user = context.HttpContext.User;
 var username = user.FindFirstValue("preferred_username");
 return true; 
 }

В этом примере мы разрешаем вызывать функцию только пользователю с ролью администратора. Подсистема авторизации позволяет вам накладывать практически любые условия.

Для авторизации может быть использована любая система HTTP-авторизации. Например, с помощью JWT Token мы передаём токен авторизации в заголовке:

В этом примере токен авторизации был получен из сервиса OAuth 2.0. Backend при получении запроса обращается в OAuth 2.0 для проверки авторизации.

4.Кэширование

Поскольку REST использует HTTP, который сам использует кэширование, вы можете использовать его для предотвращения потери ресурсов. GraphQL, с другой стороны, не имеет системы кэширования, оставляя пользователям бремя самостоятельной работы с кэшированием.Для примера разработчики могут использовать кэширование HTTP, чтобы легко избежать повторной выборки ресурсов в API на основе эндпоинтов. В таком случае URL-адрес является глобальным уникальным идентификатором (UUID).

Кэширование данных осуществляется несколькими способами:

  • Кэширование на уровне клиента. Этот подход активно используется в библиотеке Apollo.

  • Кэширование запросов — так называемые сохранённые запросы. Это когда мы передаём в запросе extensions: { "persistedQuery": {} }, в результате чего в ответе возвращается "expectedHashValue", который мы можем в дальнейшем

    использовать при новом обращении, сократив значительно запрос. Подробно об этом я рассказываю в этом видео.

5.Контроль версий

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

Так же, как и на примере с REST, мы можем осуществлять обращением к соответствующей версии. Например, .NET Core C#:

public class Query
{ 
     	/// <summary>
    	/// Конструктор
    	/// </summary>
    	public Query() { }
 
    	/// <summary>
    	/// Возвращает первую версию api
    	/// </summary>
    	public Api1 V1() =>
        	new Api1();
}

А дальше выполняем запрос GraphQL для первой версии:

query{
  v1{
    authors{
      id
      name
      books
      {
        id
        title
      }
    }
  }
}

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

6.WebSockets и подписки

GraphQL — это спецификация. Обычно мы наблюдаем GraphQL через HTTP для запросов и мутаций, однако при подписке на GraphQL нам необходимо получать непрерывные обновления от API. Именно здесь на помощь приходят WebSockets.

WebSockets часто используются в качестве транспортного протокола для GraphQL Subscriptions. Итак, подписки GraphQL не привязаны к какому-либо протоколу. На самом деле запросы и мутации GraphQL также не ограничены HTTP. Следовательно, библиотеки GraphQL Subscriptions на базе WebSockets реализуют небольшой протокол, по которому они отправляют операции и результаты подписки GraphQL.Две реализации WebSockets для GraphQL:

  1. subscriptions-transport-ws, который был создан командой Apollo (и поэтому пользуется большой поддержкой в Apollo Server), но больше не поддерживается активно;

  2. graphql-ws, который является проектом-преёмником (с небольшими несовместимостями). В его readme объясняется, как добавить его в Apollo Server.

Это просто библиотеки протоколов с реализацией на стороне сервера и на стороне клиента для облегчения операций GraphQL и отправки результатов через WebSockets. Таким образом, они избавляют вас от необходимости придумывать свой собственный протокол или реализовывать его на чем-то другом, кроме WebSockets.

GraphQL поддерживает подписную модель. Это когда по инициативе сервера данные отправляются на frontend. Для этого мы создаём класс:

/// <summary>
/// Подписки
/// </summary>
public class Subscription
{
  /// <summary>
  /// Добавлен новый автор
  /// </summary>
  /// <param name="author"></param>
  /// <returns>Автор</returns>
  [Subscribe]
  public Author OnAuthorChanged([EventMessage] Author author)
    => author;
}

Регистрируем его в разделе ConfigureServices:

services
.AddGraphQLServer()
.AddSubscriptionType<Subscription>();

После чего уже по инициативе сервера вызываем:

/// <summary>
/// Создать или обновить автора, если Id равен 0, то это однозначно новый автор
/// </summary>
/// <param name="ctx">Контекст базы данных Entity</param>
/// <param name="author">Создать или обновить автора</param>
/// <param name="sender"></param>
/// <returns>Автор</returns>    	
public async Task<Author> CreateOrUpdate(Author author, [Service] DemoContext ctx, 
                                         [Service] ITopicEventSender sender)
{
  if (author.Id == 0 || !ctx.Authors.Any(a => a.Id == author.Id))
    ctx.Add(author);
  else
    ctx.Update(author);

  ctx.SaveChanges();

  // по инициативе сервера отправляем клиентам данные
  await sender.SendAsync(nameof(Subscription.OnAuthorChanged), author);
  return author;
}

Отличия от аналогичных систем в том, что клиент также получает только те поля, которые он настроил.

В библиотеке Hot Chocolate GraphQL реализовано много всего интересного: автоматическая пагинация данных и интеграция с Redis.

Заключение

Напомним, что вокруг SOAP было столько же шумихи в конце 90-х годов, и он приобрёл огромную популярность и известность как сильная спецификация протокола для обмена структурированной информацией при применении веб-сервисов в компьютерных сетях. Однако связанные с этим полезные нагрузки были достаточно большие, а фрагментация предыдущих приложений приводила к дезориентации и препятствиям.

REST был представлен в ответ на потребность в более практичном и адаптируемом подходе к публикации и использованию веб-служб. Эта концепция была разумно проста и полностью лишена статичности, что исключало любые ненужные осложнения. Кроме того, этот подход также легко сочетается с JSON и XML. Но опять же, унификация данных была самым большим препятствием. Кроме того, ещё одной проблемой были разногласия по поводу того, как следует управлять версиями. Чтобы справиться с этой ситуацией, Facebook выступил вперёд и предоставил разработчикам решение, которое предлагает лучшее из обоих миров — GraphQL.

GraphQL — не единственное решение, не имеющее конкретного и основанного на практике объяснения. RESTful API уже много лет подтверждают свою эффективность и производительность. GraphQL затмевает недостаток REST, в то время как REST заполняет пустоты, имеющиеся в GraphQL.

Все примеры, использованные в этой статье, вы можете найти по ссылке. А дополнительные материалы для более детального изучения GraphQL есть по этой на моём канале.

Комментарии (22)


  1. alexs0ff
    03.12.2021 13:48
    +2

    А как фронт/мобилку интегрируете с GQL? Руками или есть автогенерация?


    1. leon0399
      03.12.2021 14:25
      +3

      Да, кодогенерация один из основных подходов в случае с GraphQL. На фронте есть GraphQL Codegen. Он использует т.н. Introspection Query (запрос к GraphQL для получения документации)


    1. Kulibin_s Автор
      03.12.2021 15:01
      +1

      т.к. вы можете в GaphQL получать ровно те данные которые запрашиваете, то вы пишете запрос, в плейграунде, или для основных фреймворков есть помощники, это когда вы пишите с intellisense это гораздо круче.
      У себя на канале я делал видео и по REST и GraphQL. Автогенерацию тоже разбирал.


  1. leon0399
    03.12.2021 14:23
    +5

    Думаю, стоило рассказать о то, что GraphQL зачастую используют в качестве альтернативы API Gateway (наверное даже чаще, чем в контексте единого сервиса), и о том как он позволяет один запрос перенаправить сразу на кучу сервисов. Например в контексте книг: сами книги приходят с сервиса поиска, а комментарии, соответственно, с микросервиса комментариев. И именно под такое применение заточены большинство бекенд-фреймворков GraphQL (тот же Apollo, или амазоновский AppSync)

    Или, например, про то что GraphQL - самодокументируемый с использованием Introspection, и о том что это тоже полезная фича при распределенной разработке и помогает взаимодействию команды


    1. Kulibin_s Автор
      03.12.2021 15:05
      +2

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


  1. egoserg
    03.12.2021 14:56
    +3

    GraphQL конечно интересная штука.
    Но все его плюсы, мне кажется очень сильно преувеличены.
    - Для REST API тоже можно сделать возможность указывать какие поля нужно вернуть.
    - В GraphQL присутствует проблема n+1 запрос. Если при REST API на беке можно было написать запрос с JOIN. И это будет один запрос к БД, то при GraphQL это будет множество запросов.


    1. Kulibin_s Автор
      03.12.2021 15:14
      +2

      Его плюсы в том что вы пишите гораздо меньше кода со стороны бэка. Кроме того ваши запросы, в которых вы выбираете только необходимые данные, они трансформируются в SQL с полями только теми что вы выбрали в запросе GraphQL (это показывал в одном из видео).
      Тема «проблема n+1» решённая :) по крайней мере в библиотеке со стороны бэка «Hot Chocolate».
      Отвечая про join. Почему это будет несколько запросов? Будет именно join. Так же в видео это показывал.
      У меня есть видео GraphQL где я сравниваю производительность REST и GraphQL. Я думал что будет равенство, а получилось что GraphQL быстрее.
      REST хорошая вещь, но уже реально устаревшая, многие функции приходится решать внешними «расширителями», например даже swagger (open API) это расширение, и много мелких проблем, когда при любом чихе мы делаем новую работу на бэке, ну или оставляем не оптимальные запросы, поверьте знаю о чём говорю. На канале по REST 19 видео, а GraphQL пока 8.


      1. katletmedown
        03.12.2021 21:44
        +1

        Меньше кода? Как это работает? В вашей экосистеме есть батарейки, которые автоматически генерируют запросы в базу, а для rest таких нет? В экосистеме питона, например, для graphql таблеток нет, и какая тогда бэку разница, для какого протокола запросы в базу составлять.


        1. Kulibin_s Автор
          03.12.2021 22:36
          +1

          Честно не знаю как там на пайтоне, но на C# .net Core и hot chocolate можно меньше кода писать. У вас в запросе вы можете писать аналог SQL WHERE, где можете делать условия, эти условия транслируются потом в запрос SQL. На бэке мы имеем не так много функций, а фронт может вызвать функцию с условиями как вашими, так и универсальными, я этот момент рассматривал. На фронте часто приходится по требованию заказчика переигрывать какие-то моменты, и тогда, не нужно дорабатывать бэк.

          Кроме того группировка запросов увеличивает скорость работы, на мобилках меньше батарейку ест. Да можно сделать оптимальные REST запросы, но в GraphQL это делается чуть ли не автоматом, а на REST вам каждый раз нужно все руками делать, и это может занимать много человекочасов. Я думал что REST при одинаковых условий будет чуть быстрее, но по моим тестам, наоборот GraphQL оказался быстрее, с результатами можете ознакомиться.


          1. Tihon_V
            04.12.2021 12:24

            Сколько не сталкивался с gql, столько раз приходил к тому, что "плоское - лучше вложенного". Ибо, вместо написания запросов к бд со стороны бекенда, Вы – отпускаете эту задачу к клиенту, который не обязан вдаватся в оптимизацию и чтение плана запроса, что делает сложным и сверх вариативным набор тест-кейсов для бека и соответственно позволяет декларировать бизнес-логику со стороны клиента.

            Это может весьма неплохо работать при агрегации разных API и использовании одного и того же стека со стороны бекенда и клиента, а также при относительно простых API но ИМХО неизбежно ведет к усложнению логики приложения.

            Многи библиотеки работающие с REST сегодня предоставят вам автогенерацию эндпоинтов и OIS 3.0 документации. И чаще у них предусмотрены инструменты для ограничения количества полей, связей и набора фильтров.


          1. Neikist
            05.12.2021 14:27

            Вы еще скажите что фронты при составлении этих своих запросов знают о том как в базе индексы сделаны и прочих вещах, чтобы мочь свои gql запросы оптимально писать?


            1. Kulibin_s Автор
              05.12.2021 15:46

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


    1. McRain
      03.12.2021 18:47
      +1

      Для REST API тоже можно сделать возможность указывать какие поля нужно вернуть.

      Указание полей ожидаемых в результате крайне маленькая часть GraphQL . Поля указать можно в REST, но поля вложенных объектов с аргументами указать будет уже сложнее и распарсить в REST особенно если они меняются. Как говориться "можно, а смысл"? В GraphQL сам запрос древовидный, отличается по идеологии от REST

      Если при REST API на беке можно было написать запрос с JOIN

      Все верно и в случае с GraphQL - не имеет разницы - можно написать такой же запрос чтобы вернуть такие же данные за один раз. Если нужны связанные (вложенные) данные которые не вернуть одним запросом - делать несколько запросов к БД придется и в REST и в GraphQL.


    1. SergeyTrofimov
      05.12.2021 15:37
      +2

      Если вы о Data Shaping, то в контексте .NET мы уменьшим трафик по сети, но шейпинг неизбежно будет на основе рефлексии, dynamic, expando object или схожих механизмов, что в свою очередь может ударить и по перфу. Если я не прав и вы можете подсказать эффективные механизмы Data Shaping в .NET буду признателен.


  1. AikoKirino
    03.12.2021 19:26
    +1

    Видео на досуге посмотрю, но хотелось бы узнать пару вещей:
    Как вообще с поддержкой GraphQL в .NET?
    Были ли подводные камни, недостающий функционал, костыли и вообще как там дела при работе с EF?


    1. Kulibin_s Автор
      03.12.2021 19:37
      +2

      Я разработчик на .net core ( раньше работал много лет и со старым . net framework ). Все примеры как раз на . net5 (на 6 переведу в ближайшее время) С поддержкой все очень хорошо, есть библиотека hot chocolate, которая встраивается в pipeline, она полностью бесплатная очень мощная, и с открытым кодом. Сам работаю последние года с entity framework, который и используется на бэке для работы с данными, а уже GraphQL через него, великолепно работает. Функциональности выше крыши, тут скорее нужно посмотреть что есть, что бы свои костыли не изобретать, многие вещи делаются буквально пару строк кода. Каких-то сложностей нет, всё что с моего взгляда чуть сложнее рассказываю и еще несколько материалов точно будет.


  1. Dekmabot
    04.12.2021 03:49

    Rest и GraphQL - это всё же две крайности. Rest - прям вот вообще просто и банально. GraphQL - хороший, со странностями, и всё ещё не rpc и не sql.

    Существует ещё одна альтернатива - json:api. У вас на канале про него не увидел обзоров, хотя он так же позволяет конструировать ответы, и к тому же достаточно привычен.


    1. Kulibin_s Автор
      04.12.2021 12:34
      +1

      Я еще пользовался OData, про него тоже расскажу. Но всё-таки GraphQL гораздо удобнее.

      Даже подписки вы можете делать оптимизированными и говорить что из полей вы хотите получать. + один стандарт определяет всё что нужно, а не несколько разных.

      Я понимаю что на вкус и цвет у каждого свои предподчтения, поэтому нет плохих стандартов. Это как в анекдоте: было 10 стандартов, мы придумаем супер стандарт который в 1000 раз лучше, и так появляется 11-й стандарт, потом 12-й.


  1. DaniilL
    04.12.2021 10:22
    +1

    Поставили значит на бэкенд GraphQL. Так сильно при разработке на Android я ещё не страдал (возможно потому, что мы не юзали их либу, а формировали запросы длинющей строкой). Самое неудобное - это то, что нужно на каждый запрос вводить, какие поля объекта нужно получать, и в каком порядке, что делает запросы просто огромными. Можете зайти в playground и убедиться в этом. А в остальном всё ок


    1. Kulibin_s Автор
      04.12.2021 12:29
      +1

      Запросы пишутся с подсказками на раз два. Просто наверное еще непривычно, буквально дня 2 и уже всё понятно и быстро.


  1. OkunevPY
    04.12.2021 13:48
    +1

    Много букв, мало смысла.

    1. GraphQl не замена REST api и не его альтернатива, наиболее корректное сравнение с oData.

      И Вот с этой точки зрения, ответте сами себе на вопрос, что будет если в базе много связаннных сущностей и с клиента пришол запрос глубокой вложенности? Как вы в этом мире будете обеспечивать поодержку SLA по нагрузке на бд и на время ответа сервера?

    2. GraphQl прекрасная альтернатива для построения BFF. Да бесспорно, тут он однозначно удобен. Но как говориться и тут не без подводных камнений.

      Если сервис не умеет делать выборку по запрашиваемым полям или не умеет делать пагинацию из корбки. Какого поведения вы ждёте от GraphQl? Чуда не будет, будут материализованы объекты полностью, пост обработка на стороне сервиса и формирования результата по запрошенному формату.

      GraphQl как и любая технология имеет свою область применения и свои, местами весьма сущесьвенные минусы. Палить из пушки не всегда выход если вы не умеете правильно строить архитектуру БД или проектировать красивое простое апи.

      На своих проектах мы всегда исходим из подхода что проще выполнить два легко весных запроса к разным апи и обработать их на фронте, чем городить один супер ответ и создавать точку отказа в API.


    1. Kulibin_s Автор
      04.12.2021 15:30
      +1

      Это вводная статья, конкретика будет в следующих статьях (уже есть в видео)

      1. GraphQL легко заменяет REST

      2. Вложенность легко ограничивается. Была такая форма атаки, когда спамили гигантскими вложенными запросами. Это давно решено

      3. Тем чем я пользуюсь. Умеет делать пагинацию из коробки причём как минимум 3х видов: курсоры, сдвиги, и вы можете вообще свою реализацию подкинуть.

      4. GraphQL очень применим для связи фронта и бэка. А вот для связи микросервисов между собой, я предпочитаю шину.

      5. Один суперответ(хотя прям такое редко случается), больше сгруппированные запросы, вам помогают оптимизировать запрос в БД, а так же ответ сервера, почитайте материалы Facebook где они показывают, насколько сократилось потребление энергии в мобильном устройстве, а это огромный + в наше время.

      6. GraphQL позволяет отказаться от REDUX (лично я его не долюбливаю)

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