null

Сравнение REST и GraphQL. Интеграция GraphQL в проект на Spring Boot.

Что такое REST?

REST (сокр. от Representational State Transfer) - это архитектурный стиль, используемый разработчиками для создания API, функционирующих в сети Интернет. Он подразумевает использование HTTP-запросов и предназначен для выполнения таких задач как: GET, POST, PUT и DELETE. API, построенные на REST-архитектуре, обычно обеспечивают коммуникацию между сервером и клиентами.

Ниже приведены ключевые особенности REST:

  • Нет отслеживаемого/хранимого состояния: каждый запрос API самодостаточен и содержит всю необходимую информацию для его обработки. Сервер не должен хранить какую-либо информацию о состоянии клиента между запросами.
  • Клиент-серверная архитектура: клиент и сервер являются отдельными сущностями, которые обмениваются данными по сети. Клиент отвечает за пользовательский интерфейс, а сервер - за обработку и хранение данных.
  • Кэшируемость: клиент может кэшировать ответы от сервера, чтобы улучшить производительность и снизить нагрузку на сервер.
  • Система может иметь "слои": RESTful-архитектуры могут состоять из нескольких слоев, каждый со своим набором обязанностей. Это разделение обязанностей помогает улучшить масштабируемость и поддерживаемость.
  • Единый интерфейс: RESTful API имеет четко сформулированный и стандартизированный интерфейс, что облегчает его понимание и использование. Сюда входит использование общепринятых методов HTTP (GET, POST, PUT, DELETE), логически и визуально понятных URL-адресов, наличие средств для генерации удобной и интерактивной документации.

Что такое GraphQL?

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

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

Еще одним преимуществом GraphQL является его способность обеспечивать ясное понимание требований к данным. Определяя схему данных заранее, разработчики могут гарантировать, что API предоставляет последовательные и предсказуемые ответы на запросы клиентов, что упрощает поддержку и отладку в течение времени.

Ключевые особенности GraphQL:

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

Сравнение REST и GraphQL

REST API и GraphQL API отличаются своими форматами передачи данных. Когда мы взаимодействуем с REST API, мы передаем данные в формате JSON или XML, в то время как GraphQL API принимает данные в своём определенном формате GraphQL.

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

REST API также подходит для создания общедоступных API (когда ими пользуется широкий круг клиентов с различными возможностями и требованиями).

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

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

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

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

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

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

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

Работа с GraphQL в Spring Boot

Чтобы начать работу с GraphQL в Spring Boot, необходимо добавить в проект следующие зависимости:

<dependency>
  <groupId>com.graphql-java-kickstart</groupId>
  <artifactId>graphql-spring-boot-starter</artifactId>
  <version>14.0.0</version>
</dependency>

<dependency>
  <groupId>com.graphql-java-kickstart</groupId>
  <artifactId>graphiql-spring-boot-starter</artifactId>
  <version>14.0.0</version>
</dependency>

Зависимость graphql-spring-boot-starter предоставляет необходимые классы и аннотации для создания GraphQL API в Spring Boot.

Зависимость graphiql-spring-boot-starter предоставляет пользовательский интерфейс для взаимодействия с GraphQL API, запускаемый через браузер.

Определение схемы

Сердцем GraphQL API является его схема. Схема определяет типы данных, которые могут быть запрошены и изменены в нашем API. Чтобы определить схему в Spring Boot, мы можем создать файл схемы GraphQL в src/main/resources/schema.graphqls.

Вот пример файла схемы, который определяет тип запроса с одним полем hello, возвращающим строку:

type Query {
  hello: String!
}

Чтобы сопоставить эту схему с классом Java, нам нужно создать преобразующий класс. Назовем его HelloQueryResolver. Этот класс должен реализовывать интерфейс GraphQLQueryResolver:

@Component
public class HelloQueryResolver implements GraphQLQueryResolver {
    public String hello() {
        return "Hello, World!";
    }
}

Аннотация @Component необходима, чтобы Spring создал экземпляр класса HelloQueryResolver и управлял его жизненным циклом.

Интерфейс GraphQLQueryResolver предоставляет все необходимые методы для правильного распознавания (resolving) запросов GraphQL.

 

Когда приложение запущено, мы можем получить доступ к интерфейсу GraphiQL по адресу http://localhost:8080/graphiql (указан адрес по умолчанию).

Мы можем использовать этот графический интерфейс для выполнения запросов GraphQL к нашему API (для целей разработки/тестирования и пр.).

Пример запроса, который извлекает поле hello:

query {
  hello
}

ответ:

{
  "data": {
    "hello": "Hello, World!"
  }
}

Давайте теперь попробуем с помощью GraphQL получить данные более сложного объекта.

Предположим, у нас есть объект Cat со следующими полями:

public class Cat {
  private String id;
  private String name;
  private String breed;
  private int age;
  private String favoriteFood;
  // Getters and setters
}

Мы можем определить схему GraphQL для объекта Cat следующим образом:

type Cat {
  name: String!
  breed: String!
  age: Int!
}

type Query {
  cat(id: ID!): Cat
}

И так мы задали схему для объекта "Кошка" с тремя нужными нам полями: имя, порода и возраст.

Также мы определили тип запроса с одним полем cat, который принимает параметр id и возвращает объект Cat.

Для того, чтобы сопоставить эту схему с классом Java, нам нужно создать класс-распознаватель, который будет возвращать объект Cat:

@Component
public class CatQueryResolver implements GraphQLQueryResolver {
  public Cat cat(String id) {
    // Код для извлечения объекта cat из источника данных с использованием параметра id
    // ...
    return cat;
  }
}

Чтобы извлечь объект Cat с помощью GraphQL, мы можем использовать следующий запрос:

query {
  cat(id: "777") {
    name
    breed
    age
  }
}

Когда запрос будет выполнен, будет вызван метод cat в классе CatQueryResolver, и запрошенные поля (name, breed и age для объекта Cat с идентификатором "777") будут возвращены в виде объекта JSON.

 

Конец статьи.