Найти тему
IT FROM BIT

Почему ваш следующий API стоит сделать на GraphQL

GraphQL — это стандарт декларирования структуры данных и способов получения данных, предложенный и реализованный Facebook.

Существует несколько реализаций GraphQL:

  • От Facebook — http://graphql.org/code/ Тут, правда, странность в том, что базовую технологию https://github.com/graphql/graphql-js не рекомендуют к production. Там же в наборе есть Relay — в чём-то аналог Redux, заточенный на выемку данных с помощью GraphQL-запросов.
  • От Apollo — http://www.apollostack.com/ Тут ребята постарались сделать full-stack: и сервер, который по сути представляет собой middleware для express.js, и клиент с хорошей интеграцией с React.
  • И еще 3-4 штуки можно найти тут — https://github.com/chentsulin/awesome-graphql.

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

Что мне понравилось в этой технологии:

1. Декларативное описание структур данных, которые можно запросить с сервера. Только посмотрите на эту красоту:

Так мы описали, например, что с сервера можно запросить Entity с полями _id, title, category типа EntityCategory. В apollo-stack эта строка будет автоматически преобразована в стандартный объект GraphQLSchema.

2. Удобное написание функций, получающих данные (resolvers):

-2

3. Язык запроса данных и Web UI GraphiQL (супер легко подключается к express) с очень крутой валидацией запросов и auto-complete, который учитывает текущую схему. Например, запросим только поле title у Entity по id

-3

4. Конечно же, есть удобные библиотеки для интеграции с react. Мне понравилась react-apollo, но не так давно Facebook обновила клиент relay, и он тоже выглядит неплохо. С помощью такой бибилитеки можно прямо в компоненте описать, какие данные ему нужны. При этом, если сразу рендерится несколько компонентов, которым нужны разные и\или схожие данные, то запрос за данными объединится в один (batch) и после ответа, если компонентам нужны одни и те же данные, то не будет никакого дублирования. Например, так может выглядеть запрос за пользователем. Данные про него загрузятся в props.data компонента Profile:

-4

Итого

Я вижу GraphQL как весьма удобную альтернативу классическому REST API:

  • гораздо удобнее иметь одну «ручку», в которую можно слать разнообразные запросы на получение или изменение данных (тут они называются мутациями (mutation);
  • удобнее иметь декларативное описание структуры данных, чем портянку из обработчиков путей типа req.get(‘/entities’), req.post(‘/entitites’), req.put(‘/entities/:entityId’) и т.д.
  • Также такой подход облегчает формирование единого state для react-приложений, где компоненты сами указывают, какие им нужны данные для работы.