GraphQL — это язык запросов для API и среда выполнения для выполнения этих запросов с использованием существующих данных. Он был разработан Facebook в 2012 году и открыт в 2015. В отличие от REST, GraphQL позволяет клиентам запрашивать только те данные, которые им нужны, и получать их в одном запросе.
GraphQL API определяется схемой, которая описывает типы данных и операции, которые можно выполнять. Схема включает:
Клиенты отправляют запросы на сервер, указывая, какие данные им нужны. Сервер возвращает только запрошенные данные.
Пример запроса:
{
user(id: 1) {
name
email
posts {
title
}
}
}
Ответ:
{
"data": {
"user": {
"name": "John Doe",
"email": "john@example.com",
"posts": [
{ "title": "First Post" },
{ "title": "Second Post" }
]
}
}
}
Мутации используются для изменения данных на сервере.
Пример мутации:
mutation {
createUser(name: "Jane Doe", email: "jane@example.com") {
id
name
email
}
}
Ответ:
{
"data": {
"createUser": {
"id": 2,
"name": "Jane Doe",
"email": "jane@example.com"
}
}
}
Подписки позволяют клиентам получать обновления в реальном времени.
Пример подписки:
subscription {
newPost {
title
author {
name
}
}
}
@Configuration
public class GraphQLConfig {
@Bean
public GraphQLSchema schema() {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new QueryResolver(), new MutationResolver())
.build()
.makeExecutableSchema();
}
@Bean
public GraphQL graphQL(GraphQLSchema schema) {
return GraphQL.newGraphQL(schema).build();
}
}
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
}
type Query {
user(id: ID!): User
users: [User!]!
}
type Mutation {
createUser(name: String!, email: String!): User!
}
@Component
public class QueryResolver implements GraphQLQueryResolver {
public User user(int id) {
// Логика получения пользователя
return new User(id, "John Doe", "john@example.com");
}
public List<User> users() {
// Логика получения списка пользователей
return Arrays.asList(new User(1, "John Doe", "john@example.com"));
}
}
@Component
public class MutationResolver implements GraphQLMutationResolver {
public User createUser(String name, String email) {
// Логика создания пользователя
return new User(2, name, email);
}
}
public class User {
private int id;
private String name;
private String email;
// Конструкторы, геттеры и сеттеры
}
public class Post {
private int id;
private String title;
private String content;
// Конструкторы, геттеры и сеттеры
}
GraphQL — это мощный инструмент для создания гибких и эффективных API, который предлагает множество преимуществ перед REST, включая гибкость запросов, единый эндпоинт, снижение количества запросов и поддержку реального времени. В Java GraphQL можно легко интегрировать с использованием Spring Boot, что делает его отличным выбором для современных приложений.