Руководство для начинающих по интерфейсам и объединениям GraphQL

Что такое GraphQL?

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

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

Крупные компании, такие как GitHub, Twitter, Indeed и Shopify, приняли GraphQL, подчеркивая его потенциал упростить разработку API и улучшить взаимодействие между клиентом и сервером.

Интерфейс GraphQL

В GraphQL интерфейс функционирует аналогично интерфейсам в объектно-ориентированном программировании. Это абстрактный тип, который определяет набор общих полей, которые могут реализовывать несколько типов объектов. Это обеспечивает возможность уверенного запроса этих общих полей клиентом через различные типы. 

Markdown

 

Запрос клиента GraphQL:

Markdown

 

В этом примере общие поля, такие как id, name и model, доступны для всех типов объектов, реализующих интерфейс Vehicle. Однако специфические для типа поля, такие как fuelType для Car и gearCount и isElectric для Bicycle, могут быть запрашиваемыми с использованием фрагментов.

Если клиенту нужны только общие поля, он может опустить фрагменты:

Markdown

 

Преимущества использования интерфейсов

  1. Повторное использование кода: Общие поля могут быть определены в интерфейсе и использоваться несколькими типами, что снижает избыточность.
  2. Упрощенная логика на стороне клиента: Клиентам не нужно выполнять условные проверки для типов объектов. Они могут запрашивать точные типы и уверенно обрабатывать ответы.
  3. Расширяемость схемы: Добавление нового общего поля становится проще, так как его нужно только определить в интерфейсе.
  4. Принудительная структура: Интерфейсы обеспечивают общую структуру для всех реализующих типов, гарантируя согласованность (например, все транспортные средства должны иметь id, name и model).
  5. Единое запрос: Вместо того чтобы запрашивать разные типы по отдельности, клиенты могут запрашивать один интерфейс для получения данных от всех реализующих типов.
  6. Улучшенная документация: Определяя общее поведение через интерфейсы, API-пользователям становится легче понимать и работать с связанными типами.

GraphQL Union

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

Markdown

 

Запрос клиента GraphQL:

Markdown

 

В этом примере Product, Service и Subscription – это все разные типы, которые принадлежат союзу PurchaseItem. Клиент может запросить все три типа, используя фрагменты в одном запросе, даже если они не имеют общих полей.

Важное замечание о союзах: члены типов союза должны быть только объектными базовыми типами; скалярные, интерфейсные и типы союзов не должны быть членами союза. Аналогично, оборачивающие типы не должны быть членами союза.

Преимущества использования союзов

  • Гибкая группировка: Союзы позволяют запрашивать связанные типы, которые не имеют общих полей, что было бы трудно обрабатывать в противном случае.
  • Упрощенная обработка ошибок: Клиенты могут использовать фрагменты для запроса конкретных типов, уменьшая необходимость в сложной условной логике со стороны клиента.
  • Обработка гетерогенных данных: Один запрос может извлекать данные из нескольких типов, упрощая обработку разнообразных структур данных.
  • Полезно для ответов об ошибках: Объединения особенно полезны, когда вам нужно объединить успешные ответы и детали ошибок в один тип ответа, позволяя клиентам эффективно их обрабатывать.

В итоге

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

Source:
https://dzone.com/articles/a-beginners-guide-to-graphql-interfaces-and-unions