Wprowadzenie do GraphQL z użyciem Spring Boot
Wprowadzenie do GraphQL z użyciem Spring Boot
GraphQL to sposób komunikowania się z API jako alternatywna dla stylu REST. W przypadku RESTa mamy dużą liczbę adresów (z ang. endpoint’s) gdzie każdy ma obsługę zapytań CRUD. Kiedy projekt się rozrasta liczba tych adresów rośnie. GraphQL eliminuje ten problem. Mamy jeden adres – endpoint i od konstrukcji zapytania do API zależy to co zostanie zwrócone/zrealizowane. Z artykułu dowiesz się w jaki sposób zaprojektować swoje pierwsze API z użyciem techniki GraphQL. Do dzieła! Tworzymy n0wy projekt Spring Boota.
Plik pom.xml:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphiql-spring-boot-starter</artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
Klasa modelu – User.java:
@Data @EqualsAndHashCode @Entity public class User { private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "name", nullable = false) private String name; @Column(name = "surname", nullable = false) private String surname; }
repozytorium do operacji na danych – UserRepository.java:
@Repository public interface UserRepository extends JpaRepository<User, Integer> { }
Plik src\main\resources\graphql\user.graphqls – katalog graphql należy utworzyć:
type User { id: ID!, name: String, surname: String, } type Query { users(count: Int):[User] user(id: ID):User } type Mutation { createUser(name: String!, surname: String!):User }
gdzie:
Query – typ służy do zapytań zwracających dane,
Mutation – typ służyt do zapisu danych.
Klasa serwisu:
@Service public class UserService { private final UserRepository userRepository ; public UserService(final UserRepository userRepository) { this.userRepository = userRepository ; } @Transactional public User createUser(final String name,final String surname) { final User user = new User(); user.setName(name); user.setSurname(surname); return this.userRepository.save(user); } @Transactional(readOnly = true) public List<User> gelAllUsers(final int count) { return this.userRepository.findAll().stream().limit(count).collect(Collectors.toList()); } @Transactional(readOnly = true) public Optional<User> getUser(final int id) { return this.userRepository.findById(id); } }
Klasa UserQuery – wyświetlanie użytkowników:
@Component public class UserQuery implements GraphQLQueryResolver { @Autowired private UserService userService; public List<User> getUsers(final int count) { return this.userService.gelAllUsers(count); } public Optional<User> getUser(final int id) { return this.userService.getUser(id); } }
Klasa UserMutation – zapis użytkowników:
@Component public class UserMutation implements GraphQLMutationResolver { @Autowired private UserService userService; public User createUser(final String name, final String surname) { return this.userService.createUser(name, surname); } }
po uruchomieniu aplikacji pod adresem:
http://localhost:8080/graphiql
znajduje się interfejs graficzny do wykonywania operacji GraphQL.Wykonujemy pierwsze zapytanie które utworzy nowego użytkownika i przypisze mu unikalny identyfikator – id:
mutation { createUser(name: "Java", surname: "Leader") { id } }
wynik to:
{ "data": { "createUser": { "id": "1" } } }
wykonujemy drugie zapytanie które wyświetli użytkowników:
query { users(count: 1) { id, name, surname } }
wynik to:
{ "data": { "users": [ { "id": "1", "name": "Java", "surname": "Leader" } ] } }
Leave a comment