fondo
Con el código abierto de React, Facebook ha abierto sucesivamente muchos proyectos relacionados. Estos proyectos se han utilizado en ellos durante muchos años. Lo que me llamó la atención fue que esta vez es GraphQL. Actualmente, solo existe la versión NodeJS del sitio web oficial. Dado que las pilas de tecnología de backend de muchas empresas son Java, hay una implementación de la versión Java de GraphQL, que se puede encontrar en GitHub. Sin más preámbulos, solo mire el código. Para la introducción específica, vaya al Café de Sitio web oficial, de lo contrario estará fuera de tema.
GraphQlschema
El esquema es equivalente a una base de datos, consta de muchas GraphqlfieldDefinitions, el campo es equivalente a la tabla/vista de la base de datos, y cada tabla/vista está compuesta por el nombre, los parámetros de consulta, la estructura de datos y los datos.
1) Primero defina un campo de estructura de datos (GraphQloutputType) y luego defina un método de inicialización
Private GraphQloutputType usertype; private void initOutputType () { / *** Member Object Structure* / userType = newobject () .name ("user") .field (newFieldDefinition (). Name ("id"). Type (GraphQLint) .Build ()) .Field (NewFieldDefinition (). Name ("Age"). Type (type (type ". .field (newFieldDefinition (). Name ("Nombre"). Tipo (GraphQLString) .Build ()) .Field (NewFieldDefinition (). Nombre ("Pic"). Type (GraphQLString) .Build ()) .Build ();}2) Definir dos tablas/vistas más, que incluyen nombres, parámetros de consulta, estructuras de datos y recuperación de datos
/ *** Consulta Información única del usuario* @return*/ private GraphqlfieldDefinition createUserField () {return GraphqlfieldDefinition.newfieldDefinition () .name ("user") .arGument (newarGument (). Name ("id"). Tipo (GraphQLint) .BuLild (). parámetros int id = entorno. .construir(); } / *** consulta información de múltiples miembros* @return* / private GraphqlfieldDefinition createUsersField () {return GraphqlfieldDefinition.newfieldDefinition () .Name ("Users") .arGument (newargument (). Name ("Page"). Tipo (Graphqlint) .Build ()) .arGument (newarGument (). name ("size"). type (GraphQLint) .Build ()) .ArGument (newargument (). Name ("Name"). Type (GraphQLString) .Build ()) .Type (nuevo GraphQllist (userType) .Datafetcher (Medio ambiente -> {// Get Get Query int size = Environdear.GetArgument ("Size"); 2); }3) Luego, defina un esquema y lo inicialice, contiene un nombre y una o más tablas/vistas (campos)
esquema privado GraphQlSchema; public GraphSchema () {InitOutputType (); Schema = GraphqlSchema.NeWSCHEMA (). QUIERY (NewObject () .name ("GraphQuery") .Field (createUssField ()) .Field (createUserField ()) .Build ()). Build (); }4) Después de completar los pasos anteriores, debe definir un modelo, sin límite en el nombre de la clase, pero la estructura debe cumplir con la estructura de datos definida anteriormente, y debe ser pública.
Usuario de clase pública {private int id; edad privada int; Sexo privado int; nombre de cadena privada; foto de cadena privada; // getter, setter ...}5) Luego escriba un método principal para probarlo
public static void main (string [] args) {GraphQlSchema schema = new GraphSchema (). GetsChema (); String Query1 = "{Users (página: 2, tamaño: 5, nombre:/" John/") {id, sexo, nombre, pic}}"; String Query2 = "{user (id: 6) {id, sexo, nombre, pic}}"; String Query3 = "{user (id: 6) {id, sexo, nombre, pic}, usuarios (página: 2, tamaño: 5, nombre:/" John/") {id, sexo, nombre, pic}}"; MAP <String, Object> result1 = (MAP <String, Object>) New GraphQl (Schema) .Execute (Query1) .getData (); MAP <String, Object> dultin2 = (MAP <String, Object>) New GraphQl (Schema) .Execute (Query2) .getData (); MAP <String, Object> result3 = (MAP <String, Object>) New GraphQl (Schema) .Execute (Query3) .getData (); // consulta la lista de usuarios System.out.println (resultado1); // consulta un solo usuario System.out.println (resultado2); // verificar System.out.println (result3);}Producción:
{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, sexo = 1, nombre = John_2_3, pic = pic_3.jpg}, {id = 4, sexo = 0, name = John_2_4, pic = pic_4.jpg}]} {user = {id = 6, sexo = 0, name = name_6, pic = pic_6.jpg}}} {user = {id = 6, sex = 0, name = name_6, pic = pic_6.jpg}, usuarios, usuarios [{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{[ sexo = 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, sexo = 1, name = John_2_3, pic = pic_3. sexo = 0, nombre = John_2_4, pic = pic_4.jpg}]}6) Finalmente, coloque el código en el método principal en la capa web, y solo necesita definir un parámetro de consulta, es fácil construir el servicio de consulta. La interfaz de consulta original todavía se llama en DataFetcher.
7) Introducir dependencias de Maven
<Spendency> <MoupRid> com.graphql-java </proupid> <artifactid> graphql-java </arfactid> <versión> 2.0.0 </versión> </pendency>
Con respecto a la definición de consulta GraphQL, ver esto puede ser útil para usted
json
{id = 6, sexo = 0, name = "name_6", pic = "pic_6.jpg"}consulta
{id, sexo, nombre, foto}La última parte es en realidad una cadena JSON. El resultado de la eliminación = y el valor aún es legible.
Conclusión
GraphQL trae una nueva forma de pensar, que puede simplificar el desarrollo de las API web. El cliente especifica qué datos se necesitan y qué datos devuelven el servidor, reduce la transmisión innecesaria de tráfico, es amigable con los terminales móviles y también proporciona una variedad de consultas de agregación de datos. Múltiples consultas solo usan una solicitud, que no solo cumple con la granularidad mínima de la API, sino que también satisface las necesidades del front-end, reduce las solicitudes y mejora el rendimiento.
Siento que me desarrollaré en esta dirección en el futuro, impulsado por la tendencia general.