В моей предыдущей статье я подробно рассказал о GraphQL. Пожалуйста, ознакомьтесь со статьей, прежде чем читать это.



В этой статье давайте рассмотрим, как использовать GraphQL с загрузкой Spring.

Spring обеспечивает обширную поддержку технологии GraphQL, и настроить загрузочное приложение GraphQL Spring очень просто. Команда весеннего приложения и команда GraphQL Java совместно разработали проект под названием Spring для GraphQL. Версия 1 этого проекта была выпущена 1 мая 2022 года.

Приложение Spring Boot запускает механизм Java GraphQL, который считывает/преобразует запросы в тип GraphQL с использованием схем. Затем он использует сборщики данных для выполнения операций CRUD в базе данных. Затем он предоставляет клиенту ответ JSON с полями запроса.

Протоколы GraphQL

Spring для GraphQL поддерживает запросы по таким протоколам, как HTTP, WebSocket и RSocket.

1. HTTP

Spring для GraphQL поддерживает как Spring MVC, так и Spring WebFlux. Spring MVC полагается на блокировку ввода-вывода, но Spring Webflux работает с блокировкой ввода-вывода.

Все запросы GraphQL должны использовать запрос HTTP Post, а сведения о запросе GraphQL, такие как запрос или мутация, включаются в тело запроса. Ответ на запросы GraphQL всегда равен 200 (ОК), и любые ошибки будут отображаться в разделе ошибок ответа GraphQL.

По умолчанию и предпочтительным выбором типа носителя является "application/graphql+json", но также поддерживается "application/json", как описано в спецификации.

2. Веб-сокет

WebSocket — это расширенный протокол, обеспечивающий двунаправленную дуплексную связь между клиентом и сервером. Это сделает общение интерактивным, и сервер сможет передать клиенту любые данные.

GraphQL имеет тип запроса под названием «Подписка», с помощью которого клиент может получать данные с сервера в режиме реального времени. Для этого нам нужно использовать GraphQL по протоколу WebSocket вместо использования протокола HTTP. Но этот протокол также можно использовать для обычных запросов, таких как запросы или мутации.

GraphQlWebSocketHandler classобрабатывает запросы GraphQL через WebSocket на основе протокола, определенного в библиотеке graphql-ws

Существует два варианта GraphQlWebSocketHandler: один для Spring MVC и один для Spring WebFlux.

3. RSocket

RSocket – это полностью реактивный двоичный протокол уровня приложения, который можно использовать для передачи потоков байтов, таких как TCP, WebSocket, UDP и т. д. Он обеспечивает управление потоком приложений в сети для предотвращения сбоев и повышения отказоустойчивости.

GraphQlRSocketHandler класс обрабатывает запросы GraphQL через RSocket.

  • Request-Response — отправить одно сообщение и получить одно обратно — запросы и мутации обрабатываются как запрос-ответ
  • Request-Stream — отправить одно сообщение и получить в ответ поток сообщений. Подписки GraphQL обрабатываются как потоки запросов.

В этой статье мы рассмотрим использование GraphQL только с использованием протокола HTTP, и я оставляю вам возможность изучить использование протоколов WebSocket и RSocket.

Зависимости, необходимые для Spring Boot

Нам просто нужно использовать 2 зависимости для использования GraphQL с Spring Boot, а именно Spring Web и Spring Boot GraphQL Starter.

<dependency>    
   <groupId>org.springframework.boot</groupId> 
   <artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId> 
</dependency>

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

Нам нужно добавить зависимости Spring Data JPA и H2 для хранения данных в репозитории. В этом примере я использую базу данных H2, но GraphQL не зависит от базы данных, т.е. с ней можно использовать любую базу данных.

Внедрение API-интерфейсов GraphQL

Уровень данных

Мы используем Spring Data JPA на уровне данных для выполнения операций CRUD. У нас есть объект под названием Book, и мы определили для него класс следующим образом, используя isbn в качестве первичного ключа.

  1. Класс объекта
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Book {
@Id
private String isbn;
private String title;
private String publisher;
private String[] authors;
private Date publishedDate;
}

2. Класс репозитория

У нас есть класс репозитория для класса сущностей Book следующим образом:

package io.graphql.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import io.graphql.model.Book;
@Repository
public interface BookRepository extends JpaRepository<Book, String> {
}

Сервисный уровень

У нас есть класс BookService на сервисном уровне следующим образом. Здесь в аннотации PostConstruct мы вносим данные в базу данных.

@Service
public class BookService {
@Autowired
private BookRepository bookRepository;

// load schema at application start up
@PostConstruct
private void loadSchema() throws IOException {
//Load Books into the Book Repository
 loadDataIntoDatabase();
}
private void loadDataIntoDatabase() {
//insert data into database 
}
public Book getBook(Integer id) {
 return bookRepository.findById(id);
}
public List<Book> getAllBooks() {
 return bookRepository.findAll();
}
public Book addBook(Book book) {
 return bookRepository.save(book);
}
public void deleteBook(Long isbn) {
Book book =   bookRepository.findById(isbn).orElseThrow(RuntimeException::new);
 bookRepository.delete(book);
}
}

Слой GraphQL

Давайте посмотрим на слой GraphQL. Нам нужна схема GraphQL, которая представляет собой не что иное, как структуру объекта объекта, которую может понять механизм GraphQL.

Мы собираемся создать схему для класса Book. Имена полей находятся слева, а типы — справа. Существуют различные типы данных, такие как ID, String, Int, Float и Boolean. Мы также можем использовать ссылочные типы объектов и списки.

Мы также перечислили операции запросов и мутаций, которые можно выполнять с помощью GraphQL для этого приложения Spring Boot.

Мы должны создать файл с именем books.graphql file в папке /src/main/resources, так как это место по умолчанию для сканирования Spring. . Мы даже можем изменить местоположение через недвижимость, если это необходимо.

type Book{
 isbn: String
 title: String
 publisher: String
 authors: [String]
 publishedDate: String
}
type Query{ 
  getAllBooks: [Book]
  getBook(id: String) : Book
}
type Mutation {
    addBook(author:String,name:String,publisher:String):Book
    deleteBook(id: Int!): Int!
}

Веб-слой

Как упоминалось выше, мы увидим пример GraphQL только с использованием протокола HTTP. Следовательно, мы собираемся использовать REST API в классе контроллера.

Нам нужно использовать аннотацию QueryMapping для операции запроса GraphQL и аннотацию MutationMapping для мутации (API для изменения данных). Аннотация Argument предназначена для сопоставления полей ввода из запроса GraphQL.

У нас есть 4 API, а именно

  1. получить книгу
  2. получить все книги
  3. добавить книгу
  4. удалитьКнигу
@Controller
public class BookController {
@Autowired
BookService bookService;

@QueryMapping
public Book getBook(@Argument Integer isbn) {
return bookService.getBook(isbn);
}
@QueryMapping
public List<Book> allBooks() {
return bookService.getAllBooks();
}
@MutationMapping
public Book addBook(@Argument String author, @Argument String name, @Argument String publisher) {
Book book = Book.builder().author(author).name(name).publisher(publisher).price(price).build();
return bookService.saveBook(book);
}
@MutationMapping
public String deleteBook(@Argument Long isbn {
bookService.deleteBook(isbn);
return "Book deleted";
}
}

ГрафиQL

GraphiQL — это интегрированная среда разработки (IDE) для GraphQL. Это мощный инструмент, который предлагает подсветку синтаксиса, автозаполнение IntelliSense, автоматическую документацию и т. д.

Используя GraphiQL, мы можем легко создавать запросы GraphQL.

Чтобы включить GraphiQL в приложении Spring Boot, нам просто нужно использовать следующее свойство в файле application.properties.

spring.graphql.graphiql.enabled=true

Затем нам нужно запустить приложение Spring Boot, а затем использовать URL-адрес http://localhost:8080/graphiql для загрузки GraphiQL следующим образом.

Ввод и вывод

Приведенный ниже запрос вызывает API allBooks в контроллере выше. Несмотря на то, что класс Book имеет 5 полей, мы просим только 2. Ответ всегда в формате JSON.

#returns only the 2 fields for allBooks query
query {
   allBooks{
        title
        publishedDate
  }      
}

Другой запрос может быть сделан, чтобы добавить дополнительное поле

#returns only the 3 fields for allBooks query
query {
   allBooks{
        isbn
        title
        publishedDate
   }
}
#returns only the 3 field for book query based on isbn
query {
   getBook(id:"isbn"){
        isbn
        title
        publishedDate
       }
}

Теперь мы делаем запрос на мутацию, чтобы добавить данные книги в базу данных. Запрашиваем только 2 поля isbn и name в ответ

mutation {
    addBook(
        author : "xxx"
        name: "yyy"
        publisher: "test"
    ){
        isbn
        name
    }
}

Мы можем вызвать API удаления через запрос на мутацию следующим образом.

mutation {
     deleteBook(isbn:2)
   }

Краткое содержание

В этой статье мы узнали о проекте Spring для GraphQL и трех протоколах, которые поддерживаются для GraphQL при загрузке Spring: HTTP, Websocket и RSocket. Мы подробно рассмотрели, как использовать GraphQL с Spring Boot по протоколу HTTP. Наконец, мы закончили статью рассмотрением GraphiQL.

Надеюсь, вам понравилась эта статья и спасибо за чтение

If you like to get more updates from me, 
please follow me on Medium and subscribe to email alert.

If you are considering to buy a medium membership, 
please buy through my referral link 

https://dineshchandgr.medium.com/membership