Maison >Java >javaDidacticiel >Comment SpringBoot utilise GraphQL pour développer une API Web
L'API Restful traditionnelle a de nombreux problèmes. Tout d'abord, elle ne peut pas contrôler les champs renvoyés, et le front-end ne peut pas prédire les résultats de retour du back-end, de plus, différents résultats de retour correspondent à différentes adresses de requête, ce qui est différent. conduit à de multiples demandes. GraphQL est un langage de requête API construit sur cette base. Par rapport à l'API Restful traditionnelle, il présente les avantages suivants :
Flexibilité : GraphQL peut interroger les données de manière flexible en fonction des besoins du client, contrairement à RESTful. L'API renvoie des données fixes. données structurées.
Réduire les requêtes réseau : GraphQL permet aux clients d'obtenir plusieurs ressources en une seule requête, ce qui permet de réduire le nombre de requêtes réseau et d'améliorer les performances.
Système de typage puissant : GraphQL dispose d'un système de typage puissant qui permet aux clients de détecter les erreurs dans les requêtes au moment de la compilation, ce qui contribue à réduire les erreurs d'exécution.
Cacheable : GraphQL peut être mis en cache, ce qui signifie que le serveur peut mettre en cache les résultats d'une requête, améliorant ainsi les performances et l'évolutivité.
Documentation : GraphQL a la capacité de s'auto-documenter, permettant aux développeurs de comprendre rapidement la structure et les fonctions de l'API.
Si le langage back-end est Java, alors GraphQL Java est la bibliothèque de base pour implémenter GraphQL. De plus, Spring a intégré GraphQL Si Spring est utilisé dans le projet, Spring GraphQL est plus recommandé.
Le développement de Spring GraphQL est généralement divisé en les étapes suivantes
Ajouter des dépendances Spring GraphQL
Ajouter des dépendances Spring GraphQL dans votre projet. Vous pouvez ajouter des dépendances via des outils de construction comme Maven ou Gradle. Par exemple, si vous utilisez Maven, vous pouvez ajouter la dépendance suivante
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-graphql</artifactId> </dependency>
Define GraphQL Schema
Define GraphQL Schema dans votre application. Le schéma définit les types et les champs interrogeables. Vous pouvez définir un schéma à l'aide de SDL (Schema Definition Language) ou par programme.
Pour les projets Spring Boot, le fichier de schéma est placé dans le répertoire resources/graphql/ et le nom du fichier est suffixé par graphqls. Ce qui suit est un simple schema.graphqls que j'ai défini.
Il spécifie deux implémentations de requête. author(id:Int) signifie interroger l'auteur par identifiant, et allAuthors signifie interroger le tableau Author.
schema {
query: Query
}type Query {
author(id:Int): Author
allAuthors: [Author]
}type Author {
id:Int
firstName:String
lastName:String
email:String
date de naissance:String
}
Implémentation de RuntimeWiringConfigurer
RuntimeWiringConfigurer est au cœur de l'implémentation de GraphQL pour obtenir des données. L'utilisation de GraphQL ne peut pas supprimer directement les frameworks de couche de persistance tels que Mybatis/Jpa. obtenir des données du support de base de données.
Le RuntimeWiringConfigurer est similaire à la couche de service de Spring, qui est au cœur de la mise en œuvre des données de base.
Ce qui suit est un exemple simple :
@Component public class AuthorWiring implements RuntimeWiringConfigurer { private final AuthorRepository authorRepository; public AuthorWiring(AuthorRepository authorRepository) { this.authorRepository = authorRepository; } @Override public void configure(RuntimeWiring.Builder builder) { builder.type("Query", typeWiring -> typeWiring .dataFetcher("allAuthors", environment -> authorRepository.findAll()) .dataFetcher("author", environment -> authorRepository.getReferenceById(environment.getArgument("id"))) } }
Ici, deux objets DataFetcher sont définis dans la méthode configure pour spécifier comment l'auteur et tous les auteurs interrogent les données. On peut voir que les données sont toujours interrogées via JPA.
Définissez GraphQL Controller
Nous définissons GraphQLController pour recevoir les paramètres d'entrée des requêtes Web. L'exemple est le suivant :
@RestController @RequestMapping("graphql") public class GraphQLController { private final GraphQL graphQL; @Autowired public GraphQLController(GraphQlSource graphQlSource) { graphQL = graphQlSource.graphQl(); } @PostMapping("query") public ResponseEntity<Object> query(@RequestBody String query) { ExecutionResult result = graphQL.execute(query); return ResponseEntity.ok(result.getData()); } }
L'objet GraphQL dans le code est le point d'entrée pour l'exécution des requêtes, mais GraphQL n'a qu'un constructeur privé, donc il ne peut pas être injecté directement. Les objets GraphQL doivent être obtenus en injectant GraphQlSource.
Notez que dans GraphQL, nous ne pouvons utiliser que String pour recevoir des paramètres et ne pouvons pas utiliser d'objets de modèle. En effet, les paramètres de requête Graph ne sont pas des structures JSON.
Test Graph request
Nous créons un fichier graphql.http pour effectuer des requêtes http dans idea
### Envoyer une requête POST avec le corps json
POST http://localhost:8080/graphql/query
Content-Type : application/json{
author(id: 1) {
id
firstName
lastName
date de naissance
}
}### Envoyer une requête POST avec json body
POST http://localhost:8080 /graphql/query
Content-Type : application/json{
allAuthors {
id
firstName
lastName
birthdate
}
}
Exécutez la requête de l'auteur (id : 1) et vous pourrez voir les résultats de retour normaux. Si nous n'avons besoin que des champs firstName et lastName, supprimez simplement l'identifiant et la date de naissance des paramètres d'entrée de la demande sans modifier le code back-end.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!