GraphQL — язык запросов для API
Основная потребность большинства приложений — это выборка данных из бэкэнда, который может быть базой данных, сторонним приложением, NFS и т. Д. Интерфейс API написан для облегчения этого.
Веб-сервисы REST являются одной из самых популярных архитектур для предоставления данных из серверной части. Раньше это было лучше всего, потому что темпы развития были не такими быстрыми, как сегодня. Нам всем так комфортно с REST, поэтому вопрос таков: «Является ли GraphQL лучше, чем REST?»
ОТДЫХ против GraphQL
- Производительность сети : когда пользовательский интерфейс вызывает REST API, он не будет иметь никакого контроля над данными ответа, тогда как GraphQL предоставляет механизм для указания интересующих полей в ответе. Это уменьшает перегрузку сети, выбирая наименьшее возможное количество данных.
- Конечная точка : в REST каждый ресурс идентифицируется URI. Это заставляет клиента знать каждую конечную точку. В GraphQL все ресурсы идентифицируются одной конечной точкой. Нет проблем с поддержкой нескольких URI.
- Стратегия получения данных : в GraphQL у нас есть только одна конечная точка. Клиент отправляет один запрос с обязательными полями. Это помогает повысить производительность сети и позволяет избежать проблемы чрезмерного или недостаточного извлечения данных.
Вам также может понравиться:
Пример GraphQL Java для начинающих [Spring Boot]
Что такое GraphQL?
GraphQL — это язык запросов. Это дает пользователю возможность запрашивать то, что ему нужно, тем самым снижая полезную нагрузку в сети.
Основные термины, наиболее часто используемые в GraphQL:
- Схема — договор между клиентом GraphQL и сервером GraphQL
- Запрос — аналогично вызову GET в REST и используется клиентом для запроса полей
- Мутации — это похоже на вызов POST / PUT в REST и используется клиентом для любой операции вставки / обновления
Архитектура GraphQL:
Схема и система типов
GraphQL использует язык определения схемы (SDL) для написания схемы, которая является контрактом между клиентом и сервером. В схеме мы определяем все поля и функции, предоставляемые API.
После того, как у нас есть эта схема, и клиент, и сервер могут продолжить свою разработку независимо. Клиент может смоделировать данные, пока сервер не будет готов.
Вот пример схемы для ученика и его адреса . Эта схема содержит определение типа для ученика и адреса. Каждый тип может иметь одно или несколько полей. В нашем примере Student и Address имеют 5 и 3 поля соответственно. Необнуляемые поля представлены с помощью! в конце определения поля.
Отношения между типами также можно увидеть в следующем примере. Тип адреса указан в определении типа Student.
Джава
xxxxxxxxxx
1
type student {
2
Id: ID!,
3
name: String,
4
age: Int!,
5
phone: String
6
address: Address!
7
}
8
9
type Address {
11
street: String!,
12
city: String!,
13
zipcode: Int!
14
}
15
16
type Query {
18
students(name:String);
19
}
20
type Mutation {
23
createStudent(name:String!, age:String, phone:String!);
24
}
GraphQL Query
В приведенном ниже примере запрос GraphQL содержит корневое поле, например «Студенты» и «полезную нагрузку» запроса, т.е. имя и возраст. Этот запрос также принимает аргумент имя студента. Этот запрос возвращает имя учащегося и его возраст, имя которого соответствует Смиту.
Джава
xxxxxxxxxx
1
query{
2
students(name:”Smith”) {
3
name
4
age
5
}
6
}
Мутации
Это похоже на метод REST POST. Если нам нужен API для создания / изменения данных, то мы можем пойти на мутации. Возможные мутации:
- Создание новых данных
- Изменение существующих данных
Синтаксис мутации начинается с ключевого слова мутации. Приведенная ниже мутация создает студента, а сервер возвращает уникальный идентификатор вставленной записи.
Пример:
Джава
xxxxxxxxxx
1
mutation createStudent($req: StudentInput) {
2
createStudent(input: $req)
3
name
4
address {
5
city
6
zipcode
7
}
8
}
9
}
10
Query Variable:
13
{
15
"req" : {
16
"name": "Smith",
17
"age": 30,
18
"phone": "97123 56731",
19
"address": {
20
"street": "1st Main",
21
"city": "Bengaluru",
22
"zipcode": "560066"
23
}
24
}
25
}
Resolvers
Резолверы - это функции, написанные на сервере GraphQL, соответствующие каждому полю в запросе / мутации GraphQL. Когда запрос поступает на сервер, он вызывает функции распознавателя, соответствующие полям, указанным в запросе.
GraphQL с Spring Boot
Полный исходный код доступен по адресу https://github.com/sunithan09/SampleGraphQLApp .
Теперь, когда мы знаем основные возможности GraphQL, давайте рассмотрим детали реализации GraphQL с помощью Spring Boot.
Чтобы построить сервер GraphQL с Spring Boot, все, что вам нужно, это следующие зависимости в вашем pom:
XML
xxxxxxxxxx
1
<dependency>
2
<groupId>com.graphql-java-kickstart</groupId>
3
<artifactId>graphql-spring-boot-starter</artifactId>
4
<version>5.11.1</version>
5
</dependency>
6
<dependency>
7
<groupId>com.graphql-java-kickstart</groupId>
8
<artifactId>graphql-java-tools</artifactId>
9
<version>5.7.1</version>
10
</dependency>
Когда у вас есть эти зависимости, Spring Boot загружает необходимые обработчики GraphQL для анализа схемы, и API GraphQL предоставляются в конечной точке / graphql. Это также можно настроить в application.properties.
Схема и резольверы
Схемы должны быть написаны в classpath с расширением «.graphqls». У нас может быть столько файлов схемы, сколько нам нужно. Каждый тип, определенный в схеме, должен иметь средства разрешения полей. FieldResolverError возникает, если сервер GraphQL не может найти определитель для какого-либо данного поля.
Наряду с полевыми резольверами, необходимо иметь резольвера запросов и мутацию арбитр .
Spring bean должен реализовывать GraphQL Query Resolver.
Решатель запросов для студентов может выглядеть так:
Джава
xxxxxxxxxx
1
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
2
import com.sample.graphql.modal.Student;
3
import com.sample.graphql.service.StudentService;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.stereotype.Component;
6
8
public class StudentQueryResolver implements GraphQLQueryResolver
9
{
10
11
private StudentService studentService;
12
public Student student (String name)
14
{
15
return studentService.getStudentDetailsByName(name);
16
}
17
}
И преобразователь мутаций для создания ученика будет:
Джава
xxxxxxxxxx
1
import com.coxautodev.graphql.tools.GraphQLMutationResolver;
2
import com.sample.graphql.modal.Student;
3
import com.sample.graphql.service.StudentService;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.stereotype.Component;
6
8
public class StudentMutationResolver implements GraphQLMutationResolver
9
{
10
11
private StudentService studentService;
12
public Student createStudent (Student student) {
14
return studentService.createStudentRecord(student);
15
}
16
}
тестирование
Теперь ваш сервер GraphQL готов. Вы можете проверить свои API, используя Postman или инструмент GraphiQL UI.
GraphiQL
Чтобы использовать инструмент GraphiQL UI, вы должны иметь следующую зависимость:
XML
xxxxxxxxxx
1
<dependency>
2
<groupId>com.graphql-java-kickstart</groupId>
3
<artifactId>graphiql-spring-boot-starter</artifactId>
4
<version>5.11.1</version>
5
</dependency>
GraphiQL - это веб-инструмент, доступный в корне / graphiql.
Почтальон
Мы можем использовать Postman для отправки запросов на сервер GraphQL. Это вызовы POST, и запрос передается в виде тела с типом содержимого, установленным в application / graphql.
Последние версии Postman (начиная с V7) поддерживают запросы GraphQL, где вы можете напрямую передавать запросы GraphQL или создавать и хранить схемы в самом Postman.
Пример запроса почтальона для вызова мутации:
Ограничения
GraphQL действительно отличный способ создавать и запрашивать API, но у него есть определенные ограничения. Вот некоторые из них:
- Вложенные запросы, имеющие несколько полей, могут привести к проблемам с производительностью. Запросы GraphQL должны быть тщательно спроектированы, поскольку элемент управления находится на стороне клиента, и он может задавать что угодно.
- Веб-кеширование проще с REST по сравнению с GraphQL, так как последний имеет одну конечную точку.
- Рекурсивное получение объектов (до бесконечной длины) не поддерживается в GraphQL. Нужно указать, на какую глубину нужны данные, чтобы получить рекурсивные данные.
Заключение
Хотя GraphQL становится популярным, он не всегда является лучшим выбором и не является альтернативой для веб-сервисов REST. REST имеет свои преимущества перед GraphQL с точки зрения веб-кэша, производительности и т. Д.
Помня о вышеуказанных ограничениях, вы сможете выбрать правильный инструмент для своих нужд.