Da moderne Anwendungen immer komplexer werden, wird der Aufbau skalierbarer APIs und Abfragesysteme immer wichtiger. In der Vergangenheit waren REST API und SOAP die gängigen API-Erstellungslösungen, aber mittlerweile ist auch GraphQL zu einer beliebten Option geworden. In diesem Artikel wird erläutert, wie Sie mit Spring Boot und GraphQL ein API- und Abfragesystem erstellen.
Was ist GraphQL?
GraphQL ist eine Abfragesprache für APIs und Abfragesysteme. Im Vergleich zu herkömmlichen REST-APIs bietet GraphQL die folgenden Vorteile:
Spring Boot und GraphQL
Spring Boot ist ein Java-Framework zum Erstellen von Java-basierten Webanwendungen. Es bietet viele nützliche Funktionen wie automatische Konfiguration und schnelle Entwicklung. Im Vergleich zur herkömmlichen Java-Webentwicklung kann Spring Boot den Entwicklungsprozess angenehmer und effizienter gestalten.
In diesem Artikel werden wir Spring Boot und GraphQL verwenden, um eine grundlegende API und ein Abfragesystem zu erstellen. Bevor Sie beginnen, müssen Sie die folgenden Komponenten kennen:
API und Abfragesystem erstellen
Zuerst müssen wir eine Spring Boot-Anwendung erstellen. Mit Spring Initializr können Sie schnell eine Spring Boot-Anwendung erstellen. Hier sind die Schritte zum Erstellen einer Spring Boot-Anwendung:
Erstellen eines GraphQL-Schemas
Bevor wir ein GraphQL-Schema erstellen, überlegen wir uns, was unsere API tun muss. Wir werden eine API mit drei Typen erstellen: Autor-, Buch- und Autor-Buch-Beziehung. Im Folgenden sind unsere API-Operationen aufgeführt:
Der nächste Schritt besteht darin, das GraphQL-Schema zu erstellen. Das Schema definiert die Vorgänge, die auf der API ausgeführt werden können. In diesem Artikel verwenden wir GraphQL Java Tools, um ein Schema zu erstellen. Die Schritte zum Erstellen eines GraphQL-Schemas sind wie folgt:
type Author { id: ID! name: String! } type Book { id: ID! title: String! author: Author! } type Relationship { id: ID! author: Author! book: Book! } type Query { authors: [Author] author(id: ID!): Author books: [Book] book(id: ID!): Book relationships: [Relationship] booksByAuthor(authorId: ID!): [Book] }
Dieses Schema definiert drei Typen: Autor, Buch und Beziehungen. Außerdem werden sechs Operationen definiert: Autorenliste abrufen, Autor nach ID abrufen, Buchliste abrufen, Bücher nach ID abrufen, Beziehungsliste abrufen und zugehörige Bücher nach Autoren-ID abrufen.
package com.example.demo; import com.example.demo.entity.*; import com.example.demo.repository.*; import com.example.demo.resolver.*; import java.util.List; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import graphql.schema.DataFetcher; import graphql.schema.DataFetchingEnvironment; import graphql.schema.GraphQLSchema; import graphql.schema.idl.RuntimeWiring; import graphql.schema.idl.SchemaGenerator; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeRuntimeWiring; import graphql.servlet.GraphQLServlet; import graphql.servlet.SimpleGraphQLHttpServlet; @Configuration public class GraphQLProvider { private static final Logger LOGGER = LoggerFactory.getLogger(GraphQLProvider.class); private final AuthorRepository authorRepository; private final BookRepository bookRepository; private final RelationshipRepository relationshipRepository; private List<DataFetcher> fetchDataers; @Autowired public GraphQLProvider( AuthorRepository authorRepository, BookRepository bookRepository, RelationshipRepository relationshipRepository, List<DataFetcher> fetchDataers ) { this.authorRepository = authorRepository; this.bookRepository = bookRepository; this.relationshipRepository = relationshipRepository; this.fetchDataers = fetchDataers; } @PostConstruct public void setup() { fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return authorRepository.findAll(); } }); fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return authorRepository.findById(environment.getArgument("id")).get(); } }); fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return bookRepository.findAll(); } }); fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return bookRepository.findById(environment.getArgument("id")).get(); } }); fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return relationshipRepository.findAll(); } }); fetchDataers.add(new DataFetcher() { @Override public Object get(DataFetchingEnvironment environment) { return bookRepository.findByAuthor_Id(environment.getArgument("authorId")); } }); } @Bean public GraphQLSchema schema() { SchemaParser schemaParser = new SchemaParser(); SchemaGenerator schemaGenerator = new SchemaGenerator(); TypeRuntimeWiring.Builder authorWiring = newTypeWiring("Author").dataFetchers(fetchDataers); return schemaGenerator.makeExecutableSchema(schemaParser.parse(getClass().getResource("/schema.graphqls").getPath()), RuntimeWiring.newRuntimeWiring() .type(authorWiring) .build()); } @Bean public GraphQLServlet graphQLServlet() { return new SimpleGraphQLHttpServlet(new GraphQL.Builder(schema()).build()); } }
Diese Klasse erstellt einen GraphQL-Dienst und lädt die Datei schema.graphqls in diesen Dienst und Daten Abrufer sind definiert. Datenabrufer sind dafür verantwortlich, Daten abzurufen und sie mit den Ergebnissen von GraphQL-Operationen zu füllen.
JPA-Entitäten und Repository erstellen
Jetzt müssen wir die Entitäten erstellen und sie der Datenbank zuordnen. In diesem Artikel erstellen wir Autoren-, Buch- und Beziehungsentitäten und ordnen sie mithilfe von JPA der H2-Datenbank zu.
package com.example.demo.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.demo.entity.Author; @Repository public interface AuthorRepository extends JpaRepository<Author, Long> { }
package com.example.demo.entity; import lombok.Data; import javax.persistence.*; @Data @Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; protected Author() {} public Author(String name) { this.name = name; } }
Im obigen Beispiel haben wir eine Java-Entität namens Author unter Verwendung der Felder „id“ und „name“ der @Data-Annotation von Lombok erstellt.
Daten füllen
Wir können die Daten jetzt mithilfe der H2-Konsole oder durch Schreiben von Java-Code füllen.
Verwenden Sie die H2-Konsole, um Daten einzugeben:
INSERT INTO author (id, name) VALUES (1, 'William Shakespeare'); INSERT INTO author (id, name) VALUES (2, 'John Milton'); INSERT INTO author (id, name) VALUES (3, 'Charles Dickens'); INSERT INTO book (id, title, author_id) VALUES (1, 'Hamlet', 1); INSERT INTO book (id, title, author_id) VALUES (2, 'Paradise Lost', 2); INSERT INTO book (id, title, author_id) VALUES (3, 'Oliver Twist', 3); INSERT INTO relationship (id, author_id, book_id) VALUES (1, 1, 1); INSERT INTO relationship (id, author_id, book_id) VALUES (2, 2, 2); INSERT INTO relationship (id, author_id, book_id) VALUES (3, 3, 3);
使用Java代码填充数据:
package com.example.demo.seed; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import com.example.demo.entity.Author; import com.example.demo.entity.Book; import com.example.demo.entity.Relationship; import com.example.demo.repository.AuthorRepository; import com.example.demo.repository.BookRepository; import com.example.demo.repository.RelationshipRepository; @Component public class DataSeed implements CommandLineRunner { private AuthorRepository authorRepository; private BookRepository bookRepository; private RelationshipRepository relationshipRepository; public DataSeed(AuthorRepository authorRepository, BookRepository bookRepository, RelationshipRepository relationshipRepository) { this.authorRepository = authorRepository; this.bookRepository = bookRepository; this.relationshipRepository = relationshipRepository; } @Override public void run(String... args) throws Exception { Author shakespeare = new Author("William Shakespeare"); Author milton = new Author("John Milton"); Author dickens = new Author("Charles Dickens"); authorRepository.save(shakespeare); authorRepository.save(milton); authorRepository.save(dickens); Book hamlet = new Book("Hamlet", shakespeare); Book paradiseLost = new Book("Paradise Lost", milton); Book oliverTwist = new Book("Oliver Twist", dickens); bookRepository.save(hamlet); bookRepository.save(paradiseLost); bookRepository.save(oliverTwist); relationshipRepository.save(new Relationship(shakespeare, hamlet)); relationshipRepository.save(new Relationship(milton, paradiseLost)); relationshipRepository.save(new Relationship(dickens, oliverTwist)); } }
在上面的示例中,我们创建了一个CommandLineRunner工具类,它在应用程序启动时添加示例数据到数据库中。
测试GraphQL API
我们现在可以使用GraphQL Playground工具查询GraphQL API。
以下是一些示例查询:
获取作者列表:
query { authors { id name } }
按ID获取作者:
query { author(id: 1) { id name } }
获取书籍列表:
query { books { id title author { id name } } }
按ID获取书籍:
query { book(id: 1) { id title author { id name } } }
获取作者-书籍关系列表:
query { relationships { id author { id name } book { id title } } }
按作者ID获取关联书籍:
query { booksByAuthor(authorId: 1) { id title author { id name } } }
结论
本文介绍了如何使用Spring Boot和GraphQL构建API和查询系统,并执行基本的操作。可以使用GraphQL Java Tools和JPA轻松定义Schema和映射实体。GraphQL的灵活性和可扩展性使得它成为构建现代Web应用程序的理想选择。
Das obige ist der detaillierte Inhalt vonErstellen Sie APIs und Abfragesysteme mit Spring Boot und GraphQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!