arrière-plan
Avec l'open source de React, Facebook a succédé successivement sur de nombreux projets connexes. Ces projets y sont utilisés depuis de nombreuses années. Ce qui a attiré mon attention, c'est que cette fois est GraphQL. Actuellement, il n'y a que la version NodeJS du site officiel. Étant donné que les piles de technologies backend de nombreuses entreprises sont Java, il existe une implémentation de la version Java de GraphQL, qui peut être trouvée sur GitHub. Sans plus tarder, regardez simplement le code. Pour l'introduction spécifique, accédez au café officiel du site Web, sinon ce sera hors sujet.
Graphqlschema
Le schéma est équivalent à une base de données, il se compose de nombreux GraphQlFieldDefinitions, le champ est équivalent à la table / vue de la base de données, et chaque table / vue est composée de nom, de paramètres de requête, de structure de données et de données.
1) Définissez d'abord un champ de structure de données (graphqloututType), puis définissez une méthode d'initialisation
private graphQlOutputType userType; private void initOutputType () {/ ** * Structure d'objet membre * / userType = newObject () .Name ("user") .field (newFieldDefinition (). name ("id"). Type (graphQlint) .build ()). .Field (newFieldDefinition (). Nom ("Age"). Type (GraphQlint) .Build ()) .Field (NewFieldDefinition (). Nom ("Name"). Type (GraphQlString) .Build ()) .Field (NewFieldDefinition (). Name ("Pic").2) Définissez deux autres tables / vues, qui incluent des noms, des paramètres de requête, des structures de données et une récupération de données
/ ** * Informations sur l'utilisateur unique * @return * / private graphQlfieldDefinition createUserField () {return graphQlfieldDefinition.newFieldDefinition () .Name ("user") .argument (newargument (). Name ("id"). Type (graphQlint) .build ()) .Type (usertype). Les paramètres de requête IND = Environment. ) .construire(); } / ** * Informations sur plusieurs membres de plusieurs membres * @return * / private GraphQlFieldDefinition CreateUsersField () {return GraphQlFieldDefinition.NewFieldDefinition () .Name ("Users") .argument (NewArgument (). Nom ("Page"). Type (GraphQlint) .Build ()). .Argument (newargument (). name ("taille"). type (graphQlint) .build ()) .argument (newargument (). name ("name"). type (graphQlString) .build ()) .Type (nouveau graphqLlist (usertype)) .DataFetcher (Environ Environnement.Getsargues ("Page"); 15); user.setSex (i% 2); User. }3) Définissez ensuite un schéma et l'initialisez, il contient un nom et une ou plusieurs tables / vues (champs)
schéma de graphqlschema privé; public graphschema () {initOutputType (); schema = graphQlschema.newschema (). query (newObject () .name ("graphQuery") .field (CreateUsersField ()) .Field (CreateUserField ()) .Build ()). Build (); }4) Après avoir terminé les étapes ci-dessus, vous devez définir un modèle, sans limite sur le nom de la classe, mais la structure doit respecter la structure de données définie ci-dessus, et elle doit être publique.
classe publique User {private int id; Âge privé; private int sexe; nom de chaîne privé; Pic de chaîne privée; // Getter, setter ...}5) Ensuite, écrivez une méthode principale pour la tester
public static void main (String [] args) {graphQlschema schema = new graphschema (). getChema (); String Query1 = "{utilisateurs (page: 2, taille: 5, nom: /" John / ") {id, sexe, nom, pic}}"; String Query2 = "{user (id: 6) {id, sexe, nom, pic}}"; String Query3 = "{user (id: 6) {id, sexe, nom, pic}, utilisateurs (page: 2, taille: 5, nom: /" John / ") {id, sexe, nom, pic}}"; Map <string, objet> result1 = (map <string, objet>) nouveau graphQl (schéma) .execute (query1) .getData (); Map <string, object> result2 = (map <string, object>) new graphQl (schema) .execute (query2) .getData (); Map <string, objet> result3 = (map <string, objet>) new graphQl (schema) .execute (query3) .getData (); // interroge le système d'utilisateurs System.out.println (result1); // interroger un seul Système utilisateur.out.println (result2); // Vérifiez System.out.println (result3);}Sortir:
{utilisateurs = [{id = 0, sexe = 0, name = John_2_0, pic = pic_0.jpg}, {id = 1, sexe = 1, name = John_2_1, pic = pic_1.jpg}, {id = 2, sexe = 0, name = John_2_2, pic = pic_2.jpg}, {id = 3, sex = 1, name = john_3, pic = pic_3.jpg}, {id = 4, sexe = 0, name = John_2_4, pic = pic_4.jpg}]} {user = {id = 6, sexe = 0, name = name_6, pic = pic_6.jpg}} {user = {id = 6, sex = 0, name = name_6, pic) Sex = 0, name = John_2_0, pic = pic_0.jpg}, {id = 1, sexe = 1, name = John_2_1, pic = pic_1.jpg}, {id = 2, sexe = 0, name = John_2_2, pic = pic_2.jpg}, {id = 3, sex = 1, name = John_2_3, pic = pic_3. sexe = 0, name = John_2_4, pic = pic_4.jpg}]}6) Enfin, mettez le code dans la méthode principale sur la couche Web et ne devez définir qu'un paramètre de requête, il est facile de créer le service de requête. L'interface de requête d'origine est toujours appelée dans le DataFetcher.
7) Introduire les dépendances Maven
<dependency> <proupId> com.graphql-java </prôdId> <ArtifActid> GraphQL-Java </letefactid> <Dersion> 2.0.0 </DERNIFRIENT> </DENDEFENCE>
Concernant la définition de GraphQL Query, voir cela peut vous être utile
json
{id = 6, sexe = 0, name = "name_6", pic = "pic_6.jpg"}requête
{id, sexe, nom, pic}Cette dernière partie est en fait une chaîne JSON. Le résultat de la suppression = et de la valeur est toujours lisible.
Conclusion
GraphQL apporte une nouvelle façon de penser, ce qui peut simplifier le développement des API Web. Le client spécifie les données nécessaires et les données renvoyées par le serveur, réduit la transmission de trafic inutile, est conviviale avec les terminaux mobiles et fournit également une variété de requêtes d'agrégation de données. Plusieurs requêtes n'utilisent qu'une seule demande, qui non seulement répond à la granularité minimale de l'API, mais répond également aux besoins de la frontale, réduit les demandes et améliore les performances.
Je pense que je vais me développer dans ce sens à l'avenir, motivé par la tendance générale.