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.
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 .
- As queries em Graphql permitem percorrer objetos relacionados e seus campos em uma única solicitação.
Arguments?
- Além de atravessar pelos objetos e campos podemos passar argumentos na busca desses dados.
- Podemos passar argumentos para campos escalares, para fazer conversões de dados no server em vez de cada client individualmente.
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.
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.
- 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
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
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.
Interfaces
Assim como em algumas linguagens de programação, podemos fazer uso de interfaces, para abstrair um conjunto de campos para serem implementados.
Para ajudar a implementar Graphql podemos contar com alguns servers e clients, dentre eles podemos citar:
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/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://medium.com/idexo-developers/graphql-e-rest-quais-as-diferen%C3%A7as-99cae22871a7