fundo
Com o código aberto do React, o Facebook abriu sucessivamente muitos projetos relacionados. Esses projetos são usados neles há muitos anos. O que atraiu minha atenção foi que desta vez é o GraphQL. Atualmente, existe apenas a versão NodeJS do site oficial. Como as pilhas de tecnologia de back -end de muitas empresas são Java, há uma implementação da versão Java do GraphQL, que pode ser encontrada no GitHub. Sem mais delongas, basta olhar para o código. Para a introdução específica, acesse o site oficial do site, caso contrário, ele estará fora do tópico.
GraphqlSchema
O esquema é equivalente a um banco de dados, consiste em muitas grafqlfieldDefinitions, o campo é equivalente à tabela/visualização do banco de dados e cada tabela/exibição é composta de nome, parâmetros de consulta, estrutura de dados e dados.
1) Primeiro defina um campo de estrutura de dados (grafqloutputType) e depois defina um método de inicialização
grafqloutputtype privado userType; private void initutputType () { / *** estrutura do objeto de membro* / userType = newObject () .Name ("user") .field (newfieldDefinition (). name ("id"). tipo (grafqlint) .build ()) .field (newfieldDefinition (). nome ("idade"). Tipo (grafqlint) .build ()) .field (newfieldDefinition (). name ("name"). tipo (grafqlstring) .build ().2) Defina mais duas tabelas/visualizações, que incluem nomes, parâmetros de consulta, estruturas de dados e recuperação de dados
/ *** Informações únicas para o usuário* @RETURN*/ grafqlfieldDefinition CreateUserfield () {retorna grafqlfieldDefinition.newfieldDefinition () .Name ("user") .argument (newarGument (). Name ("id"). Tipo (grafqlint) .build () Parâmetros de consulta int id = Environment.GeTargument (ID "); ) .construir(); } / *** Consulta Informações de múltiplos membros* @return* / grafqlfieldDefinition CreateUsersfield () {return graphqlfieldDefinition.newfieldDefinition () .Name ("usuários") .Argument (newargument (). Nome ("Page"). Tipo (grafqlint) .build ()) .argument (newargument (). name ("size"). tipo (grafqlint) .build ()) .argument (newargument (). name ("name"). tipo (grafqlstring) .build () .type (new graphqllist (userType). Environment.GeTarGument (Page "); User.Setage (I + 15); }3) Em seguida, defina um esquema e inicialize -o, ele contém um nome e uma ou mais tabelas/visualizações (campos)
Esquema grafqlschema privado; public GraphSchema () {InitoutputType (); schema = grafqlschema.newschema (). Query (newObject () .Name ("grafQuery") .field (createUsersfield ()) .field (createUserfield ()) .build ()). build (); }4) Após concluir as etapas acima, você precisa definir um modelo, sem limite para o nome da classe, mas a estrutura precisa atender à estrutura de dados definida acima e deve ser pública.
Public class Usuário {private int id; private Int Age; Sexo privado int; nome de string privado; foto de corda privada; // getter, setter ...}5) Em seguida, escreva um método principal para testá -lo
public static void main (string [] args) {graphqlschema schema = new GraphSchema (). getSchema (); String Query1 = "{Usuários (página: 2, tamanho: 5, nome:/" John/") {id, sexo, nome, pic}}"; String query2 = "{user (id: 6) {id, sexo, nome, pic}}"; String Query3 = "{user (id: 6) {id, sexo, nome, pic}, usuários (página: 2, tamanho: 5, nome:/" John/") {id, sexo, nome, pic}}"; Mapa <string, objeto> resultado1 = (map <string, object>) new graphql (schema) .execute (query1) .getData (); Mapa <string, objeto> resultado2 = (map <string, object>) new graphql (schema) .execute (query2) .getData (); Mapa <string, objeto> resultado3 = (map <string, object>) new graphql (schema) .execute (query3) .getData (); // consulta o sistema de lista de usuários.out.println (resultado1); // consulta um único sistema de usuário.out.println (resultado2); // check system.out.println (resultado3);}Saída:
{usuários = [{id = 0, sexo = 0, nome = john_2_0, pic = pic_0.jpg}, {id = 1, sexo = 1, nome = john_2_1, pic = pic_1.jpg}, {id = 2, sexo = 0, nome = John_2_2, pic = pic__2. pic = pic_3.jpg}, {id = 4, sexo = 0, nome = john_2_4, pic = pic_4.jpg}]} {user = {id = 6, sexo = 0, name = name_6, pic = pic_6.jpg}} {user = {id = 6, {}} = pic_6.6.jpg}} {user = {id = 6, {}} = pic_6.6, 6.jpg}} {user = {id = 6, {}} = name_6 sexo = 0, nome = John_2_0, pic = pic_0.jpg}, {id = 1, sexo = 1, nome = john_2_1, pic = pic_1.jpg}, {id = 2, sexo = 0, nome = John_2_2, pic = pic_2.jpg}, {id = 3, sexo 1, 1, 1, name = John_2_2, pic_2. sexo = 0, nome = john_2_4, pic = pic_4.jpg}]}6) Finalmente, coloque o código no método principal na camada da Web e só precisa definir um parâmetro de consulta, é fácil criar o serviço de consulta. A interface de consulta original ainda é chamada no DataFetcher.
7) Introduzir dependências do Maven
<Depencency> <PuerpId> com.graphql-java </groupId> <TRARFACTID> graphql-java </artifactId> <versão> 2.0.0 </versão </dependency>
Em relação à definição de consulta grafql, veja isso pode ser útil para você
JSON
{id = 6, sexo = 0, name = "name_6", pic = "pic_6.jpg"}consulta
{id, sexo, nome, foto}A última parte é na verdade uma string json. O resultado da remoção de = e valor ainda é legível.
Conclusão
O GraphQL traz uma nova maneira de pensar, que pode simplificar o desenvolvimento de APIs da Web. O cliente especifica quais dados são necessários e quais dados são retornados pelo servidor, reduz a transmissão desnecessária de tráfego, é amigável aos terminais móveis e também fornece uma variedade de consultas de agregação de dados. Várias consultas usam apenas uma solicitação, que não apenas atende à granularidade mínima da API, mas também atende às necessidades do front-end, reduz as solicitações e melhora o desempenho.
Sinto que vou desenvolver nessa direção no futuro, impulsionada pela tendência geral.