SlideShare a Scribd company logo
Vladimir Zaets, Magento
- новый взгляд на API
SERVICE
Get User data
Get Posts data
Get Comments data
Get …. data
Preprocessing
Data
Большое количество запросов для получения необходимых данных для страницы
Предварительная подготовка данных для UI
SERVICE
Endpoints for each pagePreprocessing
Data
SERVICE
Send list of endpointsPreprocessing
Data
domain.com/api/user
domain.com/api/comments
domain.com/api/posts
List of endpoints
Aggregation mechanism
Позволяет клиентскому приложению точно
указать, какие данные ему нужны используя
декларативную, графо-подобную структуру.
Позволяет клиенту точно указать, какие данные ему нужны используя
декларативную, графо-подобную структуру
Облегчает агрегацию данных и нескольких
источников
Облегчает агрегацию данных из нескольких
источников
Транспорт данных клиент-сервер
(http, WS, etc.)
CLIENT
SERVICE
SERVICE
Request - Response
Request - Response
Облегчает агрегацию данных из нескольких
источников
Транспорт данных клиент-сервер
(http, WS, etc.)
CLIENT
SERVICE
SERVICE
Использует систему типов для описания данных
Использует систему типов для описания
данных.
QUERY TYPES
VS
Возможность возвращать разные форматы данных
Только JSON Разные форматы
данных. XML, JSON
Возможность формировать структуру и объем
данных на клиенте
YES NO
Объем и структура
данных жестко
определенна на сервере
Передача параметров в запрос
Любое поле в запросе
может принимать параметры
Передача параметров возможно
лишь в весь запрос
domain/v1/user/:id?param=value
GraphQL CLIENT EDITOR
GraphQL CLIENT EDITOR
Query and Mutation
C R U DR
QUERY MUTATION
Для операции «Читать» Для операций «Создать», «Обновить», «Удалить»
Variables and Arguments
Декларация переменной.
Задается в JSON формате.
Передаем переменную “key” в качестве
аргумента указывая тип данной
переменной, в данном случаи “String ”.
Variables and Arguments
Значение по умолчанию
Aliases and Fragments
Aliases and Fragments
Aliases
Aliases and Fragments
Aliases
Aliases and Fragments
Фрагменты представляют собой набор
полей которые которые можно
переиспользовать
Directives
Directives
Directives
DirectiveLocation. QUERY
DirectiveLocation.INLINE_FRAGMENT
DirectiveLocation.FRAGMENT_SPREAD
Directives
https://github.com/lirown/graphql-custom-directive
GraphQL Interfaces
Interface declaration Interface implementation
GraphQL Interfaces
Request Response
GraphQL Inline Fragments
Request Response
Union types
Request Response
API для сложных выборок
https://facebook.github.io/relay/
https://github.com/facebook/relay
https://www.apollographql.com/
https://github.com/apollographql
Pagination
Pagination
Варианты имплементации:
• products( first:2 offset:2 ) – запрашиваются следующие два в списке.
Вариант 1: products( first:2 offset:2 )
PRODUCT 1
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
Возвращает
первые два
продукта
PRODUCT 0
PRODUCT 1
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
Возвращает
следующие
два, не
учитывая
добавленного
Добавлен продукт
Вариант 1: products( first:2 offset:2 )
PRODUCT 1
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
Возвращает
первые два
продукта
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
Возвращает
следующие
два, не
учитывая
удаленного
Удален Product 1
Pagination
Варианты имплементации:
• products( first:2 offset:2 ) – запрашиваются следующие два в списке.
• products( first:2 after:$cursor ) – получаем курсор из последнего элемента и
используем его для разбивки на страницы.
Вариант 2: products( first:2 after:$cursor )
PRODUCT 1
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
У PRODUCT2
cursor:
W29iamV=
Sorting and filtering
Sorting / Filtering
Дополнительный параметр sort у
которого поля:
”field” – поле по которому будет
выполнятся сортировка.
”order”- порядок сортировки.
Фильтрация выполняется
по sku продукта.
Sorting / Filtering
Гибкая фильтрация с
применением OR и AND
В каких случаях стоит использовать GraphQL?
• При использовании микросервисной
архитектуры.
• При разработке платформы/сервиса
которая рассчитан на интеграцию с
другими системами/приложениями.
• Если команды размещены в разных
локалях. (сложность коммуникации)
• При разработке простого API.
• При использовании только одного
ресурса предоставления данных.
• При условии что вы разрабатываете
финальный продукт не рассчитанный
на дальнейшее развитие в ближайшем
времени. (Интернет-магазины, промо
сайты, т.д)
• GraphQL Voyager - визуально представляет GraphQL API в виде
интерактивного графа.
https://github.com/APIs-guru/graphql-voyager
• GraphCMS - создание, редактирование GraphQL контента.
https://graphcms.com/
• GraphQL Docs – позволяет создать статическую документацию на основе
вашего API.
https://github.com/2fd/graphdoc
• GraphQL Faker – позволяет подменять данные вашего API.
Полезно для тестирования.
https://github.com/APIs-guru/graphql-faker
• Optics – метрики запросов в GraphQL API.
https://www.apollographql.com/engine/
Any questions?
The end.  Thank You.
Vladimir Zaets
https://github.com/VladimirZaets
https://www.linkedin.com/in/vladimir-zaets-22b2149a/
https://www.facebook.com/vladimir.zaets.75

More Related Content

PPTX
создание запросов, отчётов, Web страниц
PPTX
реляционная база Access
PPT
раздел 5 субд Access
PPTX
импорт информации из бд
PPTX
SQL________________________________.pptx
PPTX
Разработка, тестирование и развертывание баз данных в Visual Studio Team Syst...
PPTX
Работа с БД в Java
PPT
6 создание распределенных приложений по технологии remoting
создание запросов, отчётов, Web страниц
реляционная база Access
раздел 5 субд Access
импорт информации из бд
SQL________________________________.pptx
Разработка, тестирование и развертывание баз данных в Visual Studio Team Syst...
Работа с БД в Java
6 создание распределенных приложений по технологии remoting

Similar to Владимир Заец "GraphQL - новый взгляд на API." (20)

PDF
Лекция Android. БД SQLite, ContentProvider, Loader
PPTX
Мобильный клиент Парус. Встречайте!
PDF
Performance Monitor для Microsoft SQL Server
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
DOC
руководство пользователя на ас
PDF
"API «Битрикс24» — разбор с пристрастием". Александр Сербул, 1С-Битрикс
PDF
Report generators
PDF
Превышаем скоростные лимиты с Angular 2
PDF
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
PDF
Подход к комплексному применению методологий систематизации требований
PPT
1p
PPTX
Hadoops MapReduce framework explanations
PDF
Droidcon Moscow 2015. Clean Architecture и MVP. Алексей Макаров - Zvooq
PPT
Drupal -organizaciya_razrabotki
PPT
Drupal организация разработки
PPTX
C++ и базы данных
PDF
Performance Monitor для Oracle
PDF
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
PPTX
Новые возможности языка SQL в Firebird 3.0
PPTX
Web осень 2013 лекция 8
Лекция Android. БД SQLite, ContentProvider, Loader
Мобильный клиент Парус. Встречайте!
Performance Monitor для Microsoft SQL Server
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
руководство пользователя на ас
"API «Битрикс24» — разбор с пристрастием". Александр Сербул, 1С-Битрикс
Report generators
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Подход к комплексному применению методологий систематизации требований
1p
Hadoops MapReduce framework explanations
Droidcon Moscow 2015. Clean Architecture и MVP. Алексей Макаров - Zvooq
Drupal -organizaciya_razrabotki
Drupal организация разработки
C++ и базы данных
Performance Monitor для Oracle
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Новые возможности языка SQL в Firebird 3.0
Web осень 2013 лекция 8
Ad

More from Fwdays (20)

PDF
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
PDF
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
PPTX
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
PPTX
"Як ми переписали Сільпо на Angular", Євген Русаков
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
PDF
"Validation and Observability of AI Agents", Oleksandr Denisyuk
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
PPTX
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
PPTX
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
PDF
"AI is already here. What will happen to your team (and your role) tomorrow?"...
PPTX
"Is it worth investing in AI in 2025?", Alexander Sharko
PDF
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
PDF
"Scaling in space and time with Temporal", Andriy Lupa.pdf
PDF
"Database isolation: how we deal with hundreds of direct connections to the d...
PDF
"Scaling in space and time with Temporal", Andriy Lupa .pdf
PPTX
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
PPTX
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
PPTX
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
PPTX
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
"Як ми переписали Сільпо на Angular", Євген Русаков
"AI Transformation: Directions and Challenges", Pavlo Shaternik
"Validation and Observability of AI Agents", Oleksandr Denisyuk
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
"AI is already here. What will happen to your team (and your role) tomorrow?"...
"Is it worth investing in AI in 2025?", Alexander Sharko
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Database isolation: how we deal with hundreds of direct connections to the d...
"Scaling in space and time with Temporal", Andriy Lupa .pdf
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...
Ad

Владимир Заец "GraphQL - новый взгляд на API."

Editor's Notes

  • #2: Всем привет, тема которую я хочу представить, это graphql.Как вы уже знаете GraphQL — это стандарт декларирования структуры данных и способов получения данных который выступает дополнительным layer между клиентом и сервером.
  • #3: Всем привет, тема которую я хочу представить, это graphql.Как вы уже знаете GraphQL — это стандарт декларирования структуры данных и способов получения данных который выступает дополнительным layer между клиентом и сервером.
  • #4: Всем привет, тема которую я хочу представить, это graphql.Как вы уже знаете GraphQL — это стандарт декларирования структуры данных и способов получения данных который выступает дополнительным layer между клиентом и сервером.
  • #5: Всем привет, тема которую я хочу представить, это graphql.Как вы уже знаете GraphQL — это стандарт декларирования структуры данных и способов получения данных который выступает дополнительным layer между клиентом и сервером.
  • #17: Graphql из коробки имеет свой IDE который работает в браузере и называется он GraphiqlОн довольно удобный, сохраняет историю, подствечивает синтаксис, имеет подсказки свойствкоторые мы можем запросить, и так же он умеет парсить документацию описанную в типах, и мы можем читатьее непосредственно при написании запроса.
  • #18: Graphiql можно включить либо через конфигурациюgraphql с помощу настройки graphiql = true и перейдя по пути имя домена слеш graphql, либо же использоватьодин из екстеншенов для браузера, они имеют немного разный вид но по факту одинаковые.
  • #19: Давайте более детально разберемся из чего состоит graphql и собственно его синтаксис. СRUD. Все знают 4 базові функції управління даними, CRUD, создание, чтение, обновлениеи удаление. В случаи реста, который основан на http протоколе, данные возможности реализуютсяс помощу типа запроса, get для чтения, post для создания, put для изменения и delete для удаления соответсвенноgraphql предоставляет всего 2 основных типа запросов, чтение выполняется с помощу типа queryа удаление обновление и создание с помощу типа mutation. При этом query в стучае с http могут использоватьи get и post метод.Основе различие между query и mutation в том что query выполняются паралельно, т.к они не изменяют данных, а мутейшены выполняются последовательно, т.к они изменяют данные, и если бы они выполнялись паралельно то могли б возникать сайд ефекты в виду колизии данных.
  • #20: graphql query language поддерживает понятие переменных, формат записи переменных это обычныйJSON. В данном случаи мы передаем переменную key в запрос User, явно определя ожидаемыйтип этой переменной. Знак восклицания означает что это обьязательный параметр.далее мы можем использовать данную переменную в любом месте запроса. В данном случаи мы String в данном случаи указывает тип параметра.
  • #21: Так же мы можем декларировать значения по умолчанию. В данномслучаи 4242.
  • #22: Алиасы и фрагменты. Допустим в нашем запросе мы хотил получить данныео двух пользователях. В этом случи мы используем алиасы.Мы определяем имя алиаса и непосредственно поле которые мы хотим получить. Результирующиеданные вернутся под ключем с именем алиаса. Так же это довольно юзабельный кейс допустимдаже если нам нужна одна сущность но наш фронтенд для рендеринга ожидает определенный ключ,и что бы не производить пост процессинг, мы можем использовать алиасы.Фрагменты это еще одна довольна удобная фича graphql. Мы можем определить набор полейи переиспользовать их. Если мы вернемся к примеру то мы видим, что мы запрашиваем два юзерано тем не менее поля у них хотим аналогичные и что бы не копипастить поля мы используем фрагмент.Помимо этого мы можем запросить дополнительные поля вместе с фрагментом.
  • #23: Алиасы и фрагменты. Допустим в нашем запросе мы хотил получить данныео двух пользователях. В этом случи мы используем алиасы.Мы определяем имя алиаса и непосредственно поле которые мы хотим получить. Результирующиеданные вернутся под ключем с именем алиаса. Так же это довольно юзабельный кейс допустимдаже если нам нужна одна сущность но наш фронтенд для рендеринга ожидает определенный ключ,и что бы не производить пост процессинг, мы можем использовать алиасы.Фрагменты это еще одна довольна удобная фича graphql. Мы можем определить набор полейи переиспользовать их. Если мы вернемся к примеру то мы видим, что мы запрашиваем два юзерано тем не менее поля у них хотим аналогичные и что бы не копипастить поля мы используем фрагмент.Помимо этого мы можем запросить дополнительные поля вместе с фрагментом.
  • #24: Алиасы и фрагменты. Допустим в нашем запросе мы хотил получить данныео двух пользователях. В этом случи мы используем алиасы.Мы определяем имя алиаса и непосредственно поле которые мы хотим получить. Результирующиеданные вернутся под ключем с именем алиаса. Так же это довольно юзабельный кейс допустимдаже если нам нужна одна сущность но наш фронтенд для рендеринга ожидает определенный ключ,и что бы не производить пост процессинг, мы можем использовать алиасы.Фрагменты это еще одна довольна удобная фича graphql. Мы можем определить набор полейи переиспользовать их. Если мы вернемся к примеру то мы видим, что мы запрашиваем два юзерано тем не менее поля у них хотим аналогичные и что бы не копипастить поля мы используем фрагмент.Помимо этого мы можем запросить дополнительные поля вместе с фрагментом.
  • #25: Алиасы и фрагменты. Допустим в нашем запросе мы хотил получить данныео двух пользователях. В этом случи мы используем алиасы.Мы определяем имя алиаса и непосредственно поле которые мы хотим получить. Результирующиеданные вернутся под ключем с именем алиаса. Так же это довольно юзабельный кейс допустимдаже если нам нужна одна сущность но наш фронтенд для рендеринга ожидает определенный ключ,и что бы не производить пост процессинг, мы можем использовать алиасы.Фрагменты это еще одна довольна удобная фича graphql. Мы можем определить набор полейи переиспользовать их. Если мы вернемся к примеру то мы видим, что мы запрашиваем два юзерано тем не менее поля у них хотим аналогичные и что бы не копипастить поля мы используем фрагмент.Помимо этого мы можем запросить дополнительные поля вместе с фрагментом.
  • #26: Директивы, из коробки их всего две @include и @skip, они по сути инверсивны, то естьв данном случае если инклуд тру то мы будем получать данные по этому полю, и наоборотесли же скип тру не будет получать данные по полю.Так же есть возможность писать кастомные директивы, в документации я не нашел что бы было сказано об этом, но если посмотреть на реализацию директив то это не сложно и это работает.Я предпологаю что в будущих версиях graphql набор директив из коробки увеличится.
  • #27: Директивы, из коробки их всего две @include и @skip, они по сути инверсивны, то естьв данном случае если инклуд тру то мы будем получать данные по этому полю, и наоборотесли же скип тру не будет получать данные по полю.Так же есть возможность писать кастомные директивы, в документации я не нашел что бы было сказано об этом, но если посмотреть на реализацию директив то это не сложно и это работает.Я предпологаю что в будущих версиях graphql набор директив из коробки увеличится.
  • #28: Директивы, из коробки их всего две @include и @skip, они по сути инверсивны, то естьв данном случае если инклуд тру то мы будем получать данные по этому полю, и наоборотесли же скип тру не будет получать данные по полю.Так же есть возможность писать кастомные директивы, в документации я не нашел что бы было сказано об этом, но если посмотреть на реализацию директив то это не сложно и это работает.Я предпологаю что в будущих версиях graphql набор директив из коробки увеличится.
  • #29: Мы можем создавать интерфесы и имплементировать их в своих типах, это добавляет дополнительную строгостьчто как по мне довольно хорошо. Давайте посмотрим на пример, мы создали интерфейс Character, и создали два типа имплементировав интерфейс Character, тип human также имеет два дополнительныхполя старшипс и тотал кредитс, а дроид поле приймари фанкшн. Теперь допустим мы хотим получить главного героя в эпизоде. Мы обьявили поле hero которое ожидает в качестве параметра эпизод и возвращает данные о главном герое. Главным героем может иметь тип либо human (человек) либо дроид.И допустим мы хотим получить данные о поле праймариФанкшн которое существует у типа дроид но отсутсвует у типа хюман.Просто обьявив это поле в явном виде мы получим ошибку. В данном случаи нам и нужно использовать инлайн фрагменты.По факту это те же фрагменты только обьявлены непосредственно в запросе, и имеют немного другое предназначение.В данном случаи мы говорим что если тип героя Droid тогда возвращаем данные по полю primaryFunction.
  • #30: Мы можем создавать интерфесы и имплементировать их в своих типах, это добавляет дополнительную строгостьчто как по мне довольно хорошо. Давайте посмотрим на пример, мы создали интерфейс Character, и создали два типа имплементировав интерфейс Character, тип human также имеет два дополнительныхполя старшипс и тотал кредитс, а дроид поле приймари фанкшн. Теперь допустим мы хотим получить главного героя в эпизоде. Мы обьявили поле hero которое ожидает в качестве параметра эпизод и возвращает данные о главном герое. Главным героем может иметь тип либо human (человек) либо дроид.И допустим мы хотим получить данные о поле праймариФанкшн которое существует у типа дроид но отсутсвует у типа хюман.Просто обьявив это поле в явном виде мы получим ошибку. В данном случаи нам и нужно использовать инлайн фрагменты.По факту это те же фрагменты только обьявлены непосредственно в запросе, и имеют немного другое предназначение.В данном случаи мы говорим что если тип героя Droid тогда возвращаем данные по полю primaryFunction.
  • #31: Мы можем создавать интерфесы и имплементировать их в своих типах, это добавляет дополнительную строгостьчто как по мне довольно хорошо. Давайте посмотрим на пример, мы создали интерфейс Character, и создали два типа имплементировав интерфейс Character, тип human также имеет два дополнительныхполя старшипс и тотал кредитс, а дроид поле приймари фанкшн. Теперь допустим мы хотим получить главного героя в эпизоде. Мы обьявили поле hero которое ожидает в качестве параметра эпизод и возвращает данные о главном герое. Главным героем может иметь тип либо human (человек) либо дроид.И допустим мы хотим получить данные о поле праймариФанкшн которое существует у типа дроид но отсутсвует у типа хюман.Просто обьявив это поле в явном виде мы получим ошибку. В данном случаи нам и нужно использовать инлайн фрагменты.По факту это те же фрагменты только обьявлены непосредственно в запросе, и имеют немного другое предназначение.В данном случаи мы говорим что если тип героя Droid тогда возвращаем данные по полю primaryFunction.
  • #32: Работа с юнион типами очень похожа на работу с инлайн фрагментами, разница лишь в том что юнион типы не могут иметь общих значени.
  • #33: С основными проблемами GraphQL вроде как все, давайте теперь разберем имплементацию более сложных выборок.Я добавил на слайд два самых популярных фреймворка для имплементацииGraphQL API, это Relay от фейсбука и apollo. практически всео чем мы будем сейчас с вами говорить уже реализовано в этих фреймворках.
  • #35: Первый самый явный вариант реализации пагинации это использовать2 аргумента, первый говорит нам сколько айтемов мы хотим получить,и второй это шаг смещения.
  • #36: Давайте рассмотрим пример. у нас есть список продуктов, такой запрос возвращает первые два элемента, затем еще два и вроде все работает. Но допустим мы получили первый набор данных для первой страниц. После этого добавился еще продукт в начало колекции. В таком случаи следуйщий запрос на получение данных по второй странице вернет уже не валидные данные, а собственно, еще раз вернет второй продукт.
  • #37: Либо наоборот, кто то удалит первый продукт в списке, в таком случаи наша выборка пропустит третий продукт.
  • #38: Теперь давайте рассмотрим второй, правильный вариант. Мы так же передаем два аргумента, first который по врежнему отвечает за количество продуктов которые мы хотим получить, и after который говорит нам что следущие айтемы нужно брать после этого значения. Значение в данном случаи это курсор.
  • #39: Курсор это так называемый идинтифакатор который представленный как base64 строка которая получена на основесвойств обьекта или чаще всего только на одном свойстве-идентификаторе.Мы отправляем запрос, получаем ответ вместе с курсором, который нам нужен для получения следущего набора данных. Чаще всего добавляют еще дополнительнуюинформационые свойства, к примеру nextPage, которое говорит нам есть ли данные для следущей станици или тоталс - на сколько страниц у нас есть данныхи т.д.Собственно такой подход реализации пагинации не спецефичен для graphql это обычная cursor-based пагинация.
  • #40: Далее давайте поговорим про сортировку и фильтрацию.
  • #41: Для сортировки в качестве параметра к полю мы используем обьект sort у него есть два свойства это field - поля по которому будет происходить сортировка и ордер которое отвечает за порядок сортировкис фильтрацие все происходит ровно так же, передаем аргументом обьект фильтр, у которого свойство выступает ключем по которому будет происходить фильтация.
  • #42: Так же давайте рассмотрим более гибкую реализацию фильтация. В данном случаи появляются дополнительные поля OR и AND, в остальном фильтрация выполняется таким же образом.
  • #43: Теперь давайте разберемся в каких случаях вам стоит использоватьGraphQL а в каких не стоит. И так нужно использовать в случаяхесли у вас микросервисная архитектура, в таком случаи у вас в любом случаи будет какой либо API Gateway, так почему не использовать для этого GraphQLДалее, разработке платформы/сервиса которая рассчитан на интеграцию с другими системами/приложениями.Конечно если интеграция является довольно важным аспектом вашего приложения то очень важно иметь удобный API. По моему мнениюGraphQL действительно очень удобный, и в таких случаях затраты на имплементацию отправданы.И третий случай, если комманды размещены в разных локалях, и имеются сложности в комуникации. GraphQL позволяет максимально разделить серверную и клиенскую часть и это позволяет не создаватьботл неки между командами. И на последок, ответ на вопрос, является ли GraphQL убийцей REST?Мое мнение нет не является, и у GraphQL и у REST есть свои предназначенияс которыми они отлично справляются. Все плюсы и минусы которые я озвучилявляются обобщенными и субьективными, т.к когда какое API вам использовать зависит от очень большого количества причин и нужно рассматривать конкретный случай.Всем спасибо, и на последнем сайте ссылки на полезные утилиты при разработке GraphQL API