GraphQL як універсальний RPC

Це не зовсім освітній пост про «Що таке GraphQL або чому він так крут, або навіть продосвід використання GraphQL в продакшне. Я просто хочу коротко викласти свою думку про те, що це за технологія, і можливий практичний підхід до її застосування.

Отже, GraphQL — це мова запитів, застосовуваний Facebook для отримання даних з графових СУБД. Мова виявився настільки вдалим, що потенційна сфера його застосування значно ширше — його називають «убивцею REST» і навіть прикрутили його до реакту в якості чергового движка управліннями моделями даних. Зовсім коротко про те, що таке GraphQL:
— запит — це список полів, які потрібно повернути у відповіді. Повертаються лише ті поля, які були запитані
— поле може виявитися методом з однойменною назвою — тоді прямо в запиті вказуються параметри цього методу: {name, surname, age, getLikesCount(since: «01.01.2016»)}
— якщо значення поля або методу — об'єкт, то для нього так само треба явно вказати список полів: {name, surname, age, bestFriend: {name}}

Є багато різних думок про те, що саме в ньому таке інноваційне, але, я думаю, що сама цікава ідея ось у чому:

Модель даних — це приватний випадок моделі API



І справді, якщо в довільному json замінити поля на методи з порожнім списком параметрів, то вийде якесь спрощене API:
{
name: "John",
age: 25
friends: [{
name: "Jenny",
age: 24
}]
}

перетворюється в
Human interface {
name(): string
age(): int
friends: Human[]
}

Цей приклад демонструє важливе наслідок — якщо API і дані — це одне і те ж, то API може повертати посилання на інші API, тобто на об'єкти, що надають методи, які повертають дані (або інші API). Важливий момент — методи зовсім не зобов'язані бути идемпотентными, це цілком може бути update/delete або просто виклик певної бізнес-логіки.

Нічого не нагадує? Наприклад, граф об'єктів в працюючій програмі? З урахуванням того, що запит GraphQL, по суті, представляє з себе список методів на кореневому об'єкті, які треба викликати, а також інших фіч:
— сувора типізація
— підтримка інтерфейсів
— документоване подання схеми у вигляді структури даних
ми отримуємо, що GraphQL дозволяє виставити в мережу довільний об'єкт! І, зокрема, активну доменну модель, самописную або зібрану за допомогою ORM типу Hibernate

Багатьом не подобається надмірність GraphQL, його набір фішок і примочок, якими він обріс за час використання його в фейсбуці. Багато з них мають сенс тільки в контексті node.js і конкретного стилю розробки. Але — якщо у нас є схема і ми сказали RPC, то очевидне рішення — кодогенерация. Якщо багатослівні запити з усім цим `query`, `mutation` і оголошенням змінних будуть приховані за API, то цей недолік нівелюється.

Отже, на виході виходить RPC фреймворк, який дозволяє виставити в мережу типізований, документований, об'єктний API, що використовує в якості транспорту json і примітивне (парсер пишеться з полплевка) підмножина GraphQL. А також клієнтський кодогенератор, що надає зручний інтерфейс для виклику.

Залишилося його написати :-)

Спасибі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.