Регистрация типов интерфейса и объединения в схеме GraphQL

В этом посте мы рассмотрим API Jaal для регистрации типов интерфейсов и объединений. Jaal - это серверная библиотека GraphQL, разработанная на Go. Чтобы узнать больше об интерфейсах и объединениях GraphQL, обратитесь к официальной документации. Базовые API Jaal, такие как регистрация входов, объектов, запросов и мутаций, описаны в этом сообщении.

Схема GraphQL

Мы разработаем сервер GraphQL с использованием Jaal, который будет реализовывать следующую схему

Схема GraphQL, определенная выше, предоставляет два запроса и четыре мутации. Один запрос возвращает интерфейс MagicalCreature, а другой запрос возвращает объединение MagicalObject. Интерфейс MagicalCreature реализуется с помощью объекта Snake и объекта Spider. В объединение MagicalObject входят объекты Wand и Broomstick.

Хватит болтовни, давайте перейдем к реализации!

Шаг 1. Определение и регистрация требуемых типов

Как видите, мы определили все необходимые типы Go. Затем мы зарегистрировали их в схеме GraphQL как объекты и типы ввода. Мы также зарегистрировали мутации, необходимые для добавления данных на сервер. Для простоты мы сохранили данные в памяти. При желании вы можете использовать базу данных для хранения и извлечения данных.

Шаг 2.1. Регистрация GraphQL union

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

Этот маркер означает, что тип должен рассматриваться как тип объединения пользователем Jaal. Это также означает, что поля, возвращающие тип объединения, должны ожидать возврата этого типа в виде горячей структуры, то есть должен возвращаться только один из типов.

В нашем случае тип MagicalObject будет зарегистрирован как тип объединения в схеме GraphQL с элементами Wand и Broomstick. Поля, возвращающие MagicalObject, должны возвращать либо Wand, либо Broomstick, но не оба сразу. Это то, что мы сделали при регистрации запроса magicalObject.

Шаг 2.2. Регистрация интерфейса GraphQL

Чтобы зарегистрировать тип как интерфейс в схеме GraphQL, мы встраиваем его с помощью специального маркера schemabuilder.Interface. Этот маркер означает, что Джаал должен рассматривать тип как тип интерфейса.

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

Например, структура MagicalCreature имеет два типа: Spider и Snake. У обоих этих типов есть поля - Id, Name, HasLegs, HasWings. Следовательно, Джаал регистрирует интерфейс MagicalCreature с этими полями. Мы зарегистрировали запрос magicalCreature, который возвращает интерфейс MagicalCreature.

Шаг 3: Запуск сервера

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

Шаг 4. Увидеть это в действии

Давайте соберем наш код и запустим его.

Для выполнения запросов и мутаций мы можем использовать GraphQL Playground. Чтобы запустить пример, запустите команду go run main.go. Сервер запустится по адресу http: // localhost: 9000 / graphql. В следующем видео показано, как создать и получить MagicalCreature и MagicalObject.

Что дальше?

Мы изучили, как зарегистрировать типы интерфейса и объединения в схеме GraphQL. В следующем посте мы рассмотрим, как регистрировать настраиваемые скалярные типы на сервере GraphQL с помощью Jaal и как создавать соединения (также известные как сшивание схем).