В этой статье мы познакомим вас с Spring Boot с помощью GraphQL. Мы рассмотрим простое приложение для пива, чтобы показать вам, на что оно способно.
Итак, вы создали этот действительно приятный API со всеми получает , помещает и удаляет вы можете подумать. Ваш ребенок просто прекрасен таким, какой он есть, верно? Ну, может быть, разработчик Джо думает, что ваш ребенок толстый.
что?!
Спокойные звонки, которые у вас есть, возвращают слишком много информации. В других сценариях звонков недостаточно, и ваш ребенок остается плачущим, потому что ему нужно больше играть.
Что ж, вот тут-то и проявляется мощь GraphQL.
График – Что?
Новичок в блоке запросов API называется GraphQL. Хорошо, но что это такое? Ну, определение, взятое непосредственно с сайта GraphQL , является:
“GraphQL – это язык запросов для API и среда выполнения для выполнения этих запросов с вашими существующими данными. GraphQL предоставляет полное и понятное описание данных в вашем API, дает клиентам возможность запрашивать именно то, что им нужно, и ничего больше, упрощает разработку API с течением времени и предоставляет мощные инструменты для разработчиков”.
Ага. Здорово. Но что это такое?
GraphQL – это инструмент, который позволяет вам получать то, что вы хотите, и только то, что вы хотите, из вашего существующего API. Вы можете устранить то, что вам не нужно или о чем вы не заботитесь при реализации. Он также может предложить одно место, один звонок, чтобы присоединиться к тому, что в противном случае было бы несколькими вызовами REST для получения одной и той же информации. GraphQL может значительно ускорить производительность и упростить кодирование.
Вот видео-введение в GraphQL , а также еще немного информации о том, почему это круто и что вы можете с этим сделать.
Не В Этой Статье
В этой статье не будет подробного объяснения Spring Boot (или полной удивительности Spring Boot). Мы также будем избегать споров об использовании разработки для и против нее по сравнению с такими вещами, как NodeJS или .NET.
Тем не менее, в этой статье предполагается, что вы, по крайней мере, уже знакомы с Spring Boot и Java. Это больше о том, как вы можете быть частью “крутой” толпы и внедрять GraphQL в свой Java-проект.
Давайте Приукрасим Ваш GraphQL Ребенок с пружинным ботинком
Прежде всего, у вас должен быть либо существующий API, встроенный в Spring Boot, либо вы можете удобно использовать приложение Beer, представленное в конце этой статьи.
Затем вам нужно будет добавить их в свой pom, если их там еще нет.
org.springframework.boot
spring-boot-starter-actuator
com.graphql-java-kickstart
graphql-spring-boot-starter
7.0.1
com.graphql-java-kickstart
graphiql-spring-boot-starter
7.0.1
runtime
org.postgresql
postgresql
runtime
Затем в файле application.properties добавьте следующее:
graphql.servlet.mapping=/graphql graphql.servlet.enabled=true graphql.servlet.exception-handlers-enabled= true graphql.servlet.contextSetting= PER_REQUEST_WITH_INSTRUMENTATION # GraphiQL (not GraphQL!) graphiql.mapping= /graphiql graphiql.endpoint.graphql= /graphql graphiql.static.basePath= / graphiql.enabled= true graphiql.pageTitle= GraphiQL graphiql.props.resources.defaultQuery= schema.graphqls graphiql.props.variables.editorTheme= "solarized light"
Эти настройки сообщают GraphQL, где все настроено. Graphql – это графический интерфейс, который вы можете использовать для тестирования своих запросов GraphQL.
Это важная функция, которая поможет вам ознакомиться с использованием GraphiQL (не опечатка!). Имейте в виду, что если вы используете существующий API, вам нужно будет добавить исключения в свои правила фильтрации безопасности или сначала войти в систему. Здесь приведена дополнительная информация о том, как использовать Graphql .
Далее давайте рассмотрим мутаторы и классы запросов. Мутация – это то, что изменит данные. Таким образом, это ваше создание, обновление или удаление данных. Классы запросов – это просто методы, которые запрашивают базу данных или “получают” данные.
EntityMutationResolver.java:
@Component
public class EntityMutationResolver implements GraphQLMutationResolver {
private final BrewerService brewerService;
private final BeerService beerService;
/**
* Constructor that takes instances of injected service bean for all entities
*
* @param brewerService An instance of Spring managed BrewerService bean
* @param beerService An instance of Spring managed BeerService bean
*/
public EntityMutationResolver( BrewerService brewerService,
BeerService beerService) {
this.brewerService = brewerService;
this.beerService = beerService;
}
/**
* Adds a Brewer entity
*
* @param name Name of the Brewer
* @return An instance of Brewer if created successfully
* @throws Exception If any occurred
*/
public Brewer addBrewer(String name) throws Exception {
Brewer brewer = new Brewer(name);
return brewerService.save(brewer);
}
Ключевым моментом здесь является то, что он реализует GraphQLMutationResolver .
Здесь мы определяем методы, которые описаны в схеме GraphQL. Мы вернемся к этому позже.
EntityQueryResolver.java:
@Component
public class EntityQueryResolver implements GraphQLQueryResolver {
private final BrewerService brewerService;
private final BeerService beerService;
/**
* Constructor that takes instances of injected service bean for all entities
*
* @param brewerService An instance of Spring managed BrewerService bean
* @param beerService An instance of Spring managed BeerService bean
*/
public EntityQueryResolver(BrewerService brewerService,
BeerService beerService) {
this.brewerService = brewerService;
this.beerService = beerService;
}
/**
* Returns a Brewer for the given id
*
* @param id Primary key of the Brewer
* @return An instance of Brewer
*/
public Brewer getBrewerById(Long id) {
try {
Optional brewer = brewerService.findOne(id);
if (brewer.isPresent()) {
brewer.get().getbeers();
return brewer.get();
}
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
Здесь снова этот класс реализует Распознаватель запросов GraphQL , что позволяет схеме GraphQL разрешать эти методы. Помните, что это Получите методы типа возвращающие данные, а не изменяющие их.
Схема GraphQL
Теперь пришло время настроить GraphQL, чтобы узнать, какие методы и модели доступны. Мы делаем это, добавляя файл schema.graphics в корневой каталог проекта в папке ресурсов. Он находится в том же месте, что и файл application.properties .
Ниже приведен контент, который нам нужен:
type Brewer {
id: ID!
name: String!
beers: [Beer]!
}
type Beer {
id: ID!
title: String!
brewer: Brewer!
}
# Mutation: to add entities
type Mutation {
addBrewer(name: String!): Brewer!
addBeer(title: String!, brewerId:Int!): Beer!
}
# The Root Query for the application
type Query {
brewerById(id:Int): Brewer
beerById(id:Int): Beer
getAllBeers: [Beer]
}
Давайте вкратце разберем это:
-
Типыявляются “моделями” для объектов. -
Мутация– это методы изменения данных. -
Запрос– это определение методов, доступных для извлечения данных. - Восклицательный знак означает, что значение не может быть пустым.
- Скобки указывают на массивы. (Большинство разработчиков сочтут это простым.)
Войдите и запустите приложение Spring Boot с помощью GraphQL
Если у вас возникли проблемы, это, вероятно, связано с несоответствием между преобразователями и файлом схемы. В браузере перейдите в localhost:8080/graphiql , и он должен показать вам что-то вроде этого:
Поздравляю! Ты сделал это. Теперь вы на пути к величию GraphQL!
Таким образом, этот вывод просто сообщает вам, что доступно в вашем GraphQL. Удалите то, что там есть, и напишите эти:
mutation addBrewery {
addBrewer(name:"Leinenkugel") {
id
name
}
}
mutation addBrewsky {
addBeer(title:"Summer Shandy", brewerId:1) {
id
title
}
}
query allBreweries {
getAllBeers {
id
title
brewer {
id
name
}
}
}
Слово мутация говорит вам, что будет делать ваш GraphQL. Затем, добавить пивоварню – это то, что вы хотите, чтобы это было.
mutation addBrewery {
addBrewer(name:"Leinenkugel") {
id
name
}
}
добавить пивовара – это фактический метод, который вы собираетесь вызывать. Вы передаете поля внутри скобок.
Подсказка: графический инструмент сообщает вам, что доступно, чего он ожидает, и доступные поля для возврата. Вы должны заполнить то, что хотите, чтобы вам вернули, иначе он будет жаловаться.
mutation addBrewery {
addBrewer(name:"Leinenkugel") {
id
name
}
}
Результаты являются JSON:
{
"data": {
"addBrewer": {
"id": "1552",
"name": "Leinenkugel"
}
}
}
Несколько преимуществ Spring Boot с GraphQL
Просто подумайте об этом таким образом: ваш API возвращает таблицу, которая обычно возвращает 100 полей. Не эффективно!
С помощью GraphQL вы можете указать, что вам нужно всего несколько полей. Он настроит запрос только на запрос и вернет поля, которые вы ищете.
Это также позволяет вам создавать более простые функции CRUD, которые возвращают только все, но позволяют GraphQL и запросу определять, что вы хотите от этой реализации.
Объединение вызовов REST; хотя здесь не приведен пример, вы можете объединить несколько запросов в упрощенный запрос, ограничивающий количество запросов, которые запрашивающий должен сделать к вашему API.
Вывод
Хотя эта статья не является полным обсуждением того, чего вы можете достичь с помощью GraphQL, она дает вам приблизительный взгляд на это в отношении Spring Boot. В конечном счете это изменит правила игры для многих разработчиков, которые хотят оставаться на вершине своей игры. Если вы оказались заинтригованы Spring Boot с GraphQL и хотели бы узнать больше, вот курс по основам GraphQL это обеспечивает более глубокое знакомство с этим языком запросов.
Пожалуйста, не стесняйтесь публиковать любые вопросы или примеры, в которых вы использовали это. Я с нетерпением жду возможности использовать это в ближайшем будущем!
Ресурсы:
Ресурсы:
Оригинал: “https://dev.to/keyholesoftware/spring-boot-with-graphql-what-the-cool-kids-are-doing-1m2b”