APIs e Microsserviços

20 set, 2019

Vamos falar sobre o Graphql?

Publicidade

Graphql não é algo novo, embora mutos ainda desconheçam o que é e como ele funciona, neste artigo vou abordar alguns tópicos e conceitos e o que o diferencia do REST.

O que é Graphql?

  • Linguagem de consulta baseada em grafos, criada pelo Facebook em 2012
  • O retorno dos dados é totalmente previsível, e tornou open-source em 2015.

O que o torna diferente do REST?

  • Em REST, ao realizar buscas, temos vários endpoints, no GraphQl só temos um endpoint para acessar os dados do servidor
  • Em REST temos estrutura de dados fixa, o que faz com que sempre traga mais dados do que o necessário
  • No Graphql trazemos exatamente o que precisamos da nossa API através da construção de queries.

No Graphql, não precisamos ter um endpoint para identificar cada coisa da nossa requisição, passamos os argumentos em nossa Query, em REST teriamos um endpoint para /post, outro para /comments e asim por diante.

Como funciona?

  • Ele é uma Query language (linguagem de consulta), server-side runtime para execução dessas queries a partir da definição de schema (tipagem).
  • Não está vinculado a nenhum banco de dados específico ou mecanismo de armazenamento.
  • Um service é criado definindo types e fields e depois criando funções para cada type e cada field.
Criamos uma query com o type User e criamos o Type User tendo os Fields id e Name.
Com uma function realizamos uma consulta para pegar qual usuário está logado, com a informação do user, em outra function pegamos o nome deste usuário

Queries?

  • Com o seu service em execução, podemos enviar queries para serem validadas e executadas.
  • Um query é recebida e verificada para que somente retorne os types e fields informados na query e depois é executada
  • As queries solicitam fields específicos em objetos .
buscamos pelo nome de herói na nossa base de dados
Ele retorna R2-D2
  • As queries em Graphql permitem percorrer objetos relacionados e seus campos em uma única solicitação.
Além de trazer o nome do nosso herói também trazemos o nome dos seus amigos

Arguments?

  • Além de atravessar pelos objetos e campos podemos passar argumentos na busca desses dados.

passamos o id do humano na busca e queremos o seu nome e peso
Este é o humano retornado 😀
  • Podemos passar argumentos para campos escalares, para fazer conversões de dados no server em vez de cada client individualmente.
Podemos ao realizar a busca, já trazer algum dado convertido para a unidade de medida desejada

Aliases?

  • Os fields do objeto do resultado correspondem ao nome do campo na consulta, não seria possível consultar diretamente o mesmo campo com argumentos diferentes.
  • Para resolver isto, podemos criar aliases, para renomear o resultado do campo para algo mais descritivo que deseje.
Separamos os nomes dos heróis em império e jedi, para que o resultado se torne mais claro

Fragments?

Imagine uma situação que você tem duas pessoas e quer exibi-las lado a lado junto com seus amigos, precisaríamos repetir os campos um para cada lado da comparação?

NÃO.
Com os fragments podemos construir conjuntos de campos e inclui-los nas consultas necessárias.

Dividiríamos em right e left para exibir os resultados separadamente.
o resultado a ser exibido na metade esquerda da tela
o resultado a ser exibido na metade direita da tela
  • A ideia dos fragments é recomendada em situações em que precisamos dividir os requisitos de dados do aplicativo em parte menores, quando precisa combinar componentes da UI com vários fragments diferentes numa busca inicial.
  • Temos a possibilidade de usar variáveis nos fragments das nossas consultas
Criamos a variável na query r depois a chamamos no fragment.
retorna os 3 primeiros, conforme foi especificado em first

Ainda nas variáveis:

  • Para argumentos dinâmicos, o client pode precisar manipular os arquivos em runtime e seriariza-la em formato em Graphql.
  • O Graphql vai pegar esses dados e passar como um dicionário separado.
  • Substitua o valor estático na consulta por $variableName
  • Declarar $variableName como uma das variáveis ​​aceitas pela consulta
  • Passe variableName: value no dicionário de variáveis ​​separado, específico do transporte (geralmente JSON)

Directives

  • Podem ser anexadas a um field ou inclusão de fragment, podendo alterar a execução da consulta da forma que o servidor desejar
  • Validam se algo será ou não executado, mediante alguma condição:
  • @include(if: Boolean) Inclui somente se o resultado do campo é true
  • @skip(if: Boolean) pula o argumento se o elemento for true
Se tiver amigos este field será incluso
se setarmos isso como falso no dicionário de variáveis, logo, não será executado.

Mutations

  • São utilizadas para realizar alterações (mutações) nos dados,da mesma forma que as Queries, nas Mutations podemos passar campos aninhados.

Schemas e Types

Definem a base das nossas consultas, no exemplo abaixo definimos o conteúdo de um type Character:

  • Em Graphql Character é um tipo de objeto, o que quer dizer que é um type com alguns campos. Grande parte dos types em seu schema será de types de seus objetos.
  • Appears in são os campos que podem aparecer em qualquer parte da consulta, o Campo Episode não permite valor nulo, ele é obrigatório.
  • Episode ode retornar uma matriz com um ou mais itens
  • O campo name é um String, que é um tipo escalar incorporado e também é obrigatório que sempre retorne um nome.
No Schema definimos que teremos queries e mutations

Interfaces

Assim como em algumas linguagens de programação, podemos fazer uso de interfaces, para abstrair um conjunto de campos para serem implementados.

Criamos a interface Character para abstrair características de um personagem
No Type human fazemos a implementação de Character paa trazer essas informações.
No Type Droid também implementamos a interface Character

Para ajudar a implementar Graphql podemos contar com alguns servers e clients, dentre eles podemos citar:

Apollo

Relay

Graphcool

Hasura

Esse artigo visa dar uma base sobre o que é e como funciona o Graphql e quais são suas diferenças para o REST, abaixo as referências utilizadas tanto para os conceitos como para os exemplos, dicas de estudo e mais exemplos:

Até a próxima 😀

Referências

https://graphql.org/learn

https://graphql.org/code/#server-libraries

https://graphql.org/code/#graphql-clients

https://tableless.com.br/graphql-a-nova-era-das-apis-web/

https://speakerdeck.com/ketemartinsrufino/graphql-para-reduzir-complexidade-no-front-e-no-back

https://www.slideshare.net/PaulaSantana12?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview

https://medium.com/idexo-developers/graphql-e-rest-quais-as-diferen%C3%A7as-99cae22871a7

https://www.apollographql.com/

https://relay.dev/

https://www.graph.cool/

https://hasura.io/