Что такое 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.
Конец статьи.