Это моя попытка понять концепцию Facebook GraphQL. Я расскажу, что это такое, чем это полезно, а также три основных компонента сервера GraphQL: запросы, схемы и преобразователи.

Что такое GraphQL?

GraphQL - это мощный язык запросов, используемый для эффективного и гибкого обмена данными между клиентом и сервером в приложениях, управляемых данными. Согласно howtographql, GraphQL позволяет декларативную выборку данных.

Что именно это означает? С помощью GraphQL клиенты могут отправлять запросы к вашему API, указывая точную структуру данных, которые им нужны, и получать именно то, что они просили. Это означает, что больше не будет избыточной или недостаточной выборки данных.

Чем отличается GraphQL от подхода REST?

Традиционным API-интерфейсам REST требуется несколько настраиваемых конечных точек для получения различных сущностей или дополнительных HTTP-запросов к одной и той же конечной точке.

Например, представим, что вы хотите отобразить конкретную историю вместе с пользователем этой истории. Вам нужно будет сделать два запроса к двум конечным точкам:

// GET a single story
/api/stories/:storyId
// GET the user for that story
/api/users/:userId

Теперь вы хотите получить все истории, написанные пользователем. Что бы вы сделали? Используя REST API, для каждой истории этого пользователя вам нужно будет сделать еще один запрос к конечной точке одной истории.

Выполнение множества циклов для загрузки всех этих данных занимает много времени и становится особенно неэффективным в мобильных приложениях и медленных сетях.

Здесь на помощь приходит GraphQL. Вы можете отправить запрос GraphQL для получения нужной нам информации в одном запросе! Вот как это может выглядеть:

Запрос

query {
  story(id: 1) {
    title
    content
    comments
    user {
      name
      stories {
        title
      }
    }
  }
}

Вы можете выбирать данные, которые запрашиваете, чтобы не было риска избыточного получения данных, которые вы не собираетесь использовать, или недостаточного получения данных, которые вам определенно нужны, или данных, которые вы просто забыли получить.

Чтобы лучше визуализировать информацию, возвращаемую из запроса, вы можете использовать GraphiQL, инструмент в браузере для запроса определенных данных, определенных в схеме.

Теперь, когда у нас есть общее представление о том, что такое GraphQL, давайте перейдем к созданию сервера GraphQL!

Схема

Схема описывает данные на графике и данные, которые может запросить клиент. Поля, которые мы определяем для типа объекта, будут id, title и содержание.

Используя предыдущий пример:

const StoryType = new GraphQLObjectType({
  name: 'Story',
  fields: () => ({
    id: { type: GraphQLID },
    title: { type: GraphQLString },
    content: { type: GraphQLString }
  })
})

Когда указанный выше запрос выполняется и обрабатывается сервером, полученный ответ имеет ту же структуру, что и запрос, но как на самом деле выполняется запрос?

Резольверы

Когда сервер GraphQL получает запрос от клиента, как он узнает, что нужно извлекать данные только из запрошенных полей?

Каждое поле в схеме имеет функцию разрешения, которая реализует логику, описывающую, как получить данные для полей во входящем запросе.

Решатели несут ответственность за просмотр фактических данных и возвращение того, что необходимо.

const Query = new GraphQLObjectType({
  name: 'Query',
  fields: {
    story: {
      type: StoryType,
      args: { title: { type: GraphQLString } },
      resolve(parent, args) {
        return _.find(stories, { title: args.title })
      }
  }
})

Заключение

Когда доходит до этого, основное различие между API GraphQL и REST заключается в том, что API REST должны загружать данные из многих конечных точек, где структура возвращаемых данных фиксирована, а GraphQL предоставляет только одну конечную точку, в которой возвращаемая информация может быть настроена для по душе клиента.

Я надеюсь, что это было хоть немного полезно, и я рекомендую посмотреть документацию GraphQL, чтобы узнать больше о том, что я пытался объяснить в этом посте для более подробной информации.