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 відрізняється від REST
Тепер, коли ми розглянули основні концепції GraphQL, давайте порівняємо його з REST API, яке є одним з найпоширеніших підходів до створення API.
| Критерій | GraphQL API | REST API |
| Структура даних | Гнучка, описується схемою | Статична, залежить від структури бази даних |
| Кількість запитів до сервера | Один запит на отримання всієї необхідної інформації | Декілька запитів для отримання різних частин інформації |
| Розмір відповіді сервера | Може бути меншим за REST API завдяки можливості вибору необхідних полів | Зазвичай більший, оскільки повертає всю доступну інформацію |
| Кешування | Підтримується | Не підтримується |
| Версіонування | Не потребує версіонування, оскільки схема GraphQL є стабільною | Часто потребує версіонування для збереження сумісності зі старими клієнтами |
Як видно з таблиці, GraphQL має кілька переваг порівняно з REST API. Він дозволяє ефективніше взаємодіяти з сервером та зменшити кількість запитів, що може позитивно вплинути на продуктивність додатку.
Система типів
Однією з ключових особливостей 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):
Перерахування
Перерахування використовуються для опису обмеженого набору значень. Наприклад, у нас може бути перелік статусів замовлення: “новий”, “в обробці”, “відправлений”, “виконаний”. Також можна використовувати перерахування для передачі дозволених значень аргументів.
Наприклад:
Інтерфейси
Абстрактний тип містить набір обов’язкових полів, які повинні бути включені в типи, що успадковують цей інтерфейс. Якщо це правило не буде дотримано, то виникне помилка при перевірці схеми.
Наприклад:
Інший абстрактний тип не містить обов’язкових полів. Він може бути використаний там, де потрібно використовувати групу типів, які не мають спільних полів, наприклад, для пошуку або складних підписок.
Наприклад:
Ці типи мають різне призначення. Об’єднання використовуються там, де можна повернути один з перерахованих типів. З іншого боку, інтерфейси використовуються там, де можна сказати, що тип реалізує певний контракт.
Query, mutations, subscriptions
У GraphQL є три основні типи операцій: query, mutation та subscription. Query використовується для отримання даних з сервера, mutation – для зміни даних, а subscription – для підписки на зміни даних. Давайте розглянемо кожен з цих типів детальніше.
Query
Query використовується для отримання даних з сервера. Вона має структуру схожу на структуру даних, які ми хочемо отримати. Наприклад, якщо ми хочемо отримати всі пости користувача, наш запит може виглядати так:
Цей запит поверне ім’я користувача та список його постів з заголовками та контентом.
Mutation
Mutation використовується для зміни даних на сервері. Вона також має структуру схожу на структуру даних, які ми хочемо змінити. Наприклад, якщо ми хочемо створити новий пост для користувача, наш запит може виглядати так:
Цей запит створить новий пост для користувача з ID 123 та поверне ID, заголовок та контент цього посту.
Subscription
Subscription використовується для підписки на зміни даних на сервері. Вона також має структуру схожу на структуру даних, які ми хочемо отримати при зміні. Наприклад, якщо ми хочемо отримувати повідомлення про нові коментарі до посту, наш запит може виглядати так:
Цей запит підпише нас на отримання повідомлень про нові коментарі та повертатиме 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 модуля:
Це включає набір extension-функцій (Kotlin) та клас Rx2Apollo (Java) для перетворення ApolloCall у Observable.
Приклад використання:
Аналогічно, для підтримки Coroutines додаємо наступний імпорт:
Тут включені extension-функції для перетворення ApolloCall у Flow, Deferred та Channel.
Висновок
GraphQL – це потужна технологія, яка дозволяє ефективно взаємодіяти з сервером та отримувати лише необхідні дані. Вона широко використовується у багатьох великих компаніях та продуктах, і її популярність продовжує зростати. Розуміння основних концепцій та принципів роботи з GraphQL дозволить вам створювати більш ефективні та масштабовані додатки.
