back to top

Вступ до GraphQL: що це за мова і як використовувати її під Android

GraphQL – це нова технологія, яка швидко набула популярності серед розробників. Вона дозволяє ефективно обмінюватися даними між клієнтом і сервером, зменшуючи кількість запитів і полегшуючи роботу з API. Ця мова стала особливо популярною серед розробників для платформи Android, оскільки дозволяє ефективно працювати з даними на мобільних пристроях.

У цій статті ми розглянемо основні аспекти роботи з GraphQL для Android-розробки і подивимося, як вона може полегшити життя розробникам.

Що таке GraphQL простими словами

Перш за все, давайте розглянемо, що ж таке GraphQL. За офіційним визначенням з сайту, GraphQL – це мова запитів та маніпулювання даними для API, а також середовище для виконання цих запитів. Мова була розроблена в 2012 році в компанії Facebook для внутрішніх потреб компанії, в 2015 році стала доступною для загального користування, а з 7 листопада 2018 року над нею працює не Facebook, а GraphQL Foundation. 

Звичайно, проєкт активно розвивався з 2012 року, але особливу популярність здобув після того, як отримав статус open source. Навіть якщо раніше ви ніколи не чули про GraphQL, є велика ймовірність, що ви знаєте або використовували продукти, які були написані з його застосуванням. По-перше, це, звичайно ж, соціальна мережа Facebook. Крім неї, з GraphQL працюють при розробці таких продуктів, як Airbnb, GitHub, Pinterest, Shopify, New York Times та багатьох інших. 

Взаємодія клієнта і сервера при роботі з GraphQL

Однією з головних переваг GraphQL є те, що вона дозволяє точно вказати, які дані потрібно отримати з сервера. Це означає, що клієнт може запитувати лише ті дані, які йому необхідні, а не отримувати всю інформацію про об’єкт, як це відбувається при роботі з REST API. Також GraphQL дозволяє одночасно отримувати дані з декількох ресурсів, що значно зменшує кількість запитів до сервера.

Схема взаємодії клієнта і сервера GraphQL

Чим GraphQL відрізняється від REST

Тепер, коли ми розглянули основні концепції GraphQL, давайте порівняємо його з REST API, яке є одним з найпоширеніших підходів до створення API.

КритерійGraphQL APIREST API
Структура данихГнучка, описується схемоюСтатична, залежить від структури бази даних
Кількість запитів до сервераОдин запит на отримання всієї необхідної інформаціїДекілька запитів для отримання різних частин інформації
Розмір відповіді сервераМоже бути меншим за REST API завдяки можливості вибору необхідних полівЗазвичай більший, оскільки повертає всю доступну інформацію
КешуванняПідтримуєтьсяНе підтримується
ВерсіонуванняНе потребує версіонування, оскільки схема GraphQL є стабільноюЧасто потребує версіонування для збереження сумісності зі старими клієнтами

Як видно з таблиці, GraphQL має кілька переваг порівняно з REST API. Він дозволяє ефективніше взаємодіяти з сервером та зменшити кількість запитів, що може позитивно вплинути на продуктивність додатку.

Система типів

Однією з ключових особливостей GraphQL є система типів. Вона дозволяє строго визначити структуру даних та операцій, які можна виконувати з цими даними. У GraphQL існує кілька типів, які ми розглянемо детальніше.

Об’єктні типи

Об’єктні типи використовуються для опису даних, які можуть бути пов’язані з іншими даними. Наприклад, у нас може бути тип “Користувач”, який містить поля, такі як ім’я, прізвище та електронна пошта. Також цей тип може мати зв’язок з іншими типами, наприклад “Пости” або “Коментарі”.

Наприклад:

Об’єктні типи в GraphQL

Скалярні типи

У GraphQL є можливість використовувати поля різних типів, але в кінцевому підсумку вони повинні бути приведені до одного з підтримуваних скалярних типів. До стандартних скалярних типів GraphQL належать:

  • Int – 32-бітне ціле число зі знаком;
  • Float – число подвійної точності зі знаком;
  • String – рядок в UTF-8;
  • Boolean – логічний тип (true або false);
  • ID – спеціальний скалярний тип, який представляє унікальний ідентифікатор, який найчастіше використовується для отримання об’єкта або як ключ у кеші. Значення типу ID серіалізуються так само, як і String, але той факт, що для ідентифікаторів було виділено окремий тип даних, свідчить про те, що він повинен використовуватися не для відображення клієнту, а тільки у програмах.

У багатьох реалізаціях сервісів GraphQL є можливість створювати власні скалярні типи.

Варто також зазначити, що у GraphQL можна додавати так звані модифікатори типів (type modifiers), які впливають на перевірку полів. Дуже поширеним є модифікатор non-null, який гарантує, що дане значення ніколи не буде null (інакше отримаємо помилку виконання). Позначається як !, наприклад:

    id: ID!

Іншим поширеним модифікатором є List. Можна позначити тип як List, у такому випадку очікується, що на цьому місці буде повернений масив з таких значень. Позначається як [], наприклад:

    films: [Film!]

Модифікатори можна комбінувати і використовувати на будь-якому рівні вкладеності.

 Аргументи

Аргументи використовуються для передачі додаткових параметрів до запитів. Наприклад, якщо ми хочемо отримати всі пости користувача за певний період часу, ми можемо передати аргумент “дата”, який буде вказувати, з якого моменту потрібно отримати пости.

Наприклад, тут до поля Film прив’язаний аргумент id (у даному прикладі літерал типу ID):

Аргументи в GraphQL

Перерахування

Перерахування використовуються для опису обмеженого набору значень. Наприклад, у нас може бути перелік статусів замовлення: “новий”, “в обробці”, “відправлений”, “виконаний”. Також можна використовувати перерахування для передачі дозволених значень аргументів.

Наприклад:

Перерахування в GraphQL

Інтерфейси

Абстрактний тип містить набір обов’язкових полів, які повинні бути включені в типи, що успадковують цей інтерфейс. Якщо це правило не буде дотримано, то виникне помилка при перевірці схеми. 

Наприклад:

Інтерфейси в GraphQL

Інший абстрактний тип не містить обов’язкових полів. Він може бути використаний там, де потрібно використовувати групу типів, які не мають спільних полів, наприклад, для пошуку або складних підписок. 

Наприклад:

Інтерфейси в GraphQL

Ці типи мають різне призначення. Об’єднання використовуються там, де можна повернути один з перерахованих типів. З іншого боку, інтерфейси використовуються там, де можна сказати, що тип реалізує певний контракт.

Query, mutations, subscriptions

У GraphQL є три основні типи операцій: query, mutation та subscription. Query використовується для отримання даних з сервера, mutation – для зміни даних, а subscription – для підписки на зміни даних. Давайте розглянемо кожен з цих типів детальніше.

Query

Query використовується для отримання даних з сервера. Вона має структуру схожу на структуру даних, які ми хочемо отримати. Наприклад, якщо ми хочемо отримати всі пости користувача, наш запит може виглядати так:

Query в GraphQL

Цей запит поверне ім’я користувача та список його постів з заголовками та контентом.

Mutation

Mutation використовується для зміни даних на сервері. Вона також має структуру схожу на структуру даних, які ми хочемо змінити. Наприклад, якщо ми хочемо створити новий пост для користувача, наш запит може виглядати так:

Mutation в GraphQL

Цей запит створить новий пост для користувача з ID 123 та поверне ID, заголовок та контент цього посту.

Subscription

Subscription використовується для підписки на зміни даних на сервері. Вона також має структуру схожу на структуру даних, які ми хочемо отримати при зміні. Наприклад, якщо ми хочемо отримувати повідомлення про нові коментарі до посту, наш запит може виглядати так:

Subscription в GraphQL

Цей запит підпише нас на отримання повідомлень про нові коментарі та повертатиме ID та контент цих коментарів.

Introspection query і GraphQL Playground

Introspection query – це спеціальний запит, який дозволяє отримати інформацію про схему GraphQL. Вона дуже корисна для вивчення структури даних та доступних операцій. Для виконання introspection query у GraphQL є спеціальний тип _schema, який містить всю необхідну інформацію. Також існує багато інструментів, які дозволяють виконувати introspection query та переглядати схему GraphQL у зручному вигляді. Один з них – це GraphQL Playground, який є частиною багатьох бібліотек для роботи з GraphQL. Він дозволяє виконувати запити та переглядати результати у зручному інтерфейсі.

Робота з GraphQL API при розробці для Android

Тепер, коли ми зрозуміли, що таке GraphQL та як він працює, давайте розглянемо, як його можна використовувати для розробки додатків для Android. Для цього нам знадобиться додаткова бібліотека – Apollo Android.

Apollo Android – це бібліотека, яка дозволяє легко та зручно працювати з GraphQL API на платформі Android. Вона надає можливість генерувати класи для запитів та мутацій на основі схеми сервера, що дозволяє уникнути ручного написання коду для взаємодії з API.

Для початку роботи з Apollo Android потрібно додати його залежність до файлу build.gradle:

implementation ‘com.apollographql.apollo:apollo-runtime:x.x.x’

де x.x.x – це версія бібліотеки.

Після цього потрібно створити об’єкт ApolloClient, який буде використовуватися для взаємодії з сервером. Для цього потрібно передати URL до GraphQL API та об’єкт OkHttpClient:

val apolloClient = ApolloClient.builder()

  .serverUrl(“https://example.com/graphql”)

  .okHttpClient(okHttpClient)

  .build()

Тепер ми можемо виконувати запити до сервера за допомогою методу query або mutate:

apolloClient.query(GetUserQuery(id = 123))

  .enqueue(object: ApolloCall.Callback() {

    override fun onResponse(response: Response) {

      // обробка відповіді

    }

    override fun onFailure(e: ApolloException) {

      // обробка помилки

    }

  })

де GetUserQuery – це клас, який був згенерований на основі схеми сервера та містить необхідні поля та аргументи для запиту. Після отримання відповіді ми можемо отримати дані за допомогою методу response.data.

Також Apollo Android підтримує реактивне програмування за допомогою RxJava2 та Kotlin Coroutines. Для цього потрібно додати відповідні залежності та використовувати методи rxQuery та coroutineQuery для виконання запитів.

Підтримка RxJava2 та Kotlin Coroutines

Для додавання підтримки RxJava2 у проект необхідно виконати наступний імпорт у build.gradle модуля:

build.gradle модуль у GraphQL

Це включає набір extension-функцій (Kotlin) та клас Rx2Apollo (Java) для перетворення ApolloCall у Observable. 

Приклад використання:

Перетворення ApolloCall у Observable

Аналогічно, для підтримки Coroutines додаємо наступний імпорт:

Підтримка Coroutines в GraphQL

Тут включені extension-функції для перетворення ApolloCall у Flow, Deferred та Channel.

Перетворення ApolloCall у Flow, Deferred та Channel

Висновок

GraphQL – це потужна технологія, яка дозволяє ефективно взаємодіяти з сервером та отримувати лише необхідні дані. Вона широко використовується у багатьох великих компаніях та продуктах, і її популярність продовжує зростати. Розуміння основних концепцій та принципів роботи з GraphQL дозволить вам створювати більш ефективні та масштабовані додатки.

Ще більше новин

Останні новини