Hintergrund
Mit der Open Source of React hat Facebook nacheinander viele verwandte Projekte eröffnet. Diese Projekte werden seit vielen Jahren in ihnen verwendet. Was meine Aufmerksamkeit erregt war, dass diese Zeit GraphQl ist. Derzeit gibt es nur die NodeJS -Version der offiziellen Website. Da die Backend -Technologie -Stapel vieler Unternehmen Java sind, gibt es eine Java -Versionsimplementierung von GraphQL, die auf Github zu finden ist. Schauen Sie sich ohne weiteres den Code an. Für die spezifische Einführung gehen Sie zum offiziellen Website -Café, da es sonst nicht zu einem Thema ist.
GraphQlschema
Das Schema entspricht einer Datenbank, es besteht aus vielen GraphQlfieldDefinitionen, dem Feld entspricht der Datenbanktabelle/-ansicht, und jede Tabelle/Ansicht besteht aus Namen, Abfrageparametern, Datenstruktur und Daten.
1) Definieren Sie zuerst eine Datenstruktur (GraphQLoutputType) und dann eine Initialisierungsmethode
private GraphQLoutputType userType; private void initoutputType () { / *** Mitgliedsobjektstruktur* / userType = newObject () .name ("user") .field (newfieldDefinition (). Name ("ID"). Typ (GraphQLint) .build () ().) .field(newFieldDefinition().name("age").type(GraphQLInt).build()) .field(newFieldDefinition().name("name").type(GraphQLString).build()) .field(newFieldDefinition().name("pic").type(GraphQLString).build()) .build();}2) Definieren Sie zwei weitere Tabellen/Ansichten, die Namen, Abfrageparameter, Datenstrukturen und Datenabruf enthalten
/** * Query single user information* @return */ private GraphQLFieldDefinition createUserField() { return GraphQLFieldDefinition.newFieldDefinition() .name("user") .argument(newArgument().name("id").type(GraphQLInt).build()) .type(userType) .dataFetcher(environment -> { // Get query parameters int id = environment.getArgument("id"); // Execute the query, here you can use some test data to illustrate the problem User user = new User(); user.setId(id); user.setAge(id + 15); user.setSex(id % 2); user.setName("Name_" + id); user.setPic("pic_" + id + ".jpg"); return user; }) .bauen(); } / *** Abfragen Sie mehrere Mitgliederinformationen* @return* / private GraphQlfieldDefinition createUsersfield () {return GraphQlfieldDefinition.NewfieldDefinition () .Name ("Benutzer") .Argument (newArgument (). Name ("Seite"). Typ (GraphQLint) .Build ()).). .Argument (newArgument (). name ("size"). type (GraphQLint) .build ()) .Argument (newArgument (). Name ("Name"). Typ (GraphQlstring) .build ()) .Type (neue GraphQllist (Usertype) .Dataforter (Umgebung (Umgebung -> {// Get Query Parameters). environment.getArgument("page"); int size = environment.getArgument("size"); String name = environment.getArgument("name"); // Execute the query, here you can use some test data to illustrate the problem List<User> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { User user = new User(); user.setId(i); user.setAge(i + 15) user.setSex (i % 2); }3) Definieren Sie dann ein Schema und initialisieren Sie es, es enthält einen Namen und einen oder mehrere Tabellen/Ansichten (Felder)
privates GraphQlschema -Schema; public GraphSchema () {initoutputType (); schema = graphQlSchema.newSchema (). query (newObject () .name ("graphQuery") .field (createSersfield ()) .field (createUserfield ()) .build ()). Build (); }4) Nach Abschluss der oben genannten Schritte müssen Sie ein Modell ohne Begrenzung des Klassennamens definieren. Die Struktur muss jedoch die oben definierte Datenstruktur erfüllen, und es muss öffentlich sein.
Public Class User {private int id; privates int Alter; Privat int Sex; privater Zeichenfolge Name; privates Zeichenfolgenbild; // Getter, Setter ...}5) Schreiben Sie dann eine Hauptmethode, um sie zu testen
public static void main (String [] args) {GraphQlschema Schema = new GraphSchema (). getSchema (); String query1 = "{Benutzer (Seite: 2, Größe: 5, Name:/" John/") {ID, Sex, Name, Pic}}"; String query2 = "{user (id: 6) {id, sex, name, pic}}"; String query3 = "{user (id: 6) {id, sex, name, pic}, Benutzer (Seite: 2, Größe: 5, Name:/" John/") {id, sex, name, pic}}"; Karte <string, Object> result1 = (map <string, object>) New GraphQl (Schema) .execute (query1) .getData (); MAP <string, Object> result2 = (map <string, objekt>) neu GraphQl (Schema) .execute (query2) .getData (); Karte <string, object> result3 = (map <string, object>) new GraphQl (Schema) .execute (query3) .getData (); // Die Benutzerliste system.out.println (Ergebnis1) abfragen; // ein einzelnes Benutzer system.out.println (Ergebnis2) abfragen; // system.out.println (result3);} prüfen;}Ausgabe:
{users=[{id=0, sex=0, name=john_2_0, pic=pic_0.jpg}, {id=1, sex=1, name=john_2_1, pic=pic_1.jpg}, {id=2, sex=0, name=john_2_2, pic=pic_2.jpg}, {id=3, sex=1, name=john_2_3, pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}}{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}, users=[{id=0, sex = 0, name = John_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, name = John_2_1, pic = pic_1.jpg}, {id = 2, sex = 0, name = John_2_2, pic = pic_2.jpg}, {id = 3, sex = 1, name = John_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2_2. sex = 0, name = John_2_4, pic = pic_4.jpg}]}6) Stellen Sie den Code schließlich in die Hauptmethode in die Webschicht ein und müssen nur einen Abfrageparameter definieren. Es ist einfach, den Abfragedienst zu erstellen. Die ursprüngliche Abfrageschnittstelle ist im DataFetcher weiterhin aufgerufen.
7) MAVEN -Abhängigkeiten einführen
<De vorhöhe> <gruppe> com.graphql-java </Groupid> <artifactID> Graphql-Java </artifactId> <version> 2.0.0 </Version> </abhängig>
In Bezug auf die Definition der GraphQL -Abfrage kann dies für Sie hilfreich sein
JSON
{id = 6, sex = 0, name = "name_6", pic = "pic_6.jpg"}Abfrage
{ID, Sex, Name, Bild}Der letztere Teil ist eigentlich eine JSON -String. Das Ergebnis von Entfernen = und Wert ist noch lesbar.
Abschluss
GraphQL bringt eine neue Denkweise mit, die die Entwicklung von Web -APIs vereinfachen kann. Der Client gibt an, welche Daten benötigt werden und welche Daten vom Server zurückgegeben werden, reduziert die unnötige Verkehrsübertragung, ist freundlich zu mobilen Terminals und liefert auch eine Vielzahl von Datenaggregationsabfragen. Mehrere Abfragen verwenden nur eine Anfrage, die nicht nur die Mindestgranularität der API entspricht, sondern auch den Anforderungen des Front-Ends reduziert, die Anfragen reduziert und die Leistung verbessert.
Ich habe das Gefühl, dass ich mich in Zukunft in diese Richtung entwickeln werde, angetrieben vom allgemeinen Trend.