GraphQL – Uma vida sem REST

Eu já tinha ouvido falar sobre GraphQL quando estava iniciando meus estudos em React há dois anos atrás, mas nunca tinha parado pra analisar e entender como realmente funcionava. Recentemente, um colega de curso havia me dito que a empresa onde ele trabalhava estava utilizando GraphQL, e que os resultados estavam sendo bons. Eu nem pude conversar muito, pois, eu nem sabia exatamente sobre o que se tratava. A verdade é que, quanto mais eu lia sobre essa ferramenta incrível do Facebook, mais eu ficava entusiasmado para implementar aquilo em todos os meus projetos.

A princípio, pode parecer que o GraphQL seja uma ferramenta meramente supérflua para projetos modernos, mas, no meu caso, ele suprimiu um problema que estava me dando dor de cabeça há alguns dias em um projeto.

Imagine-se na seguinte situação: você possui dois bancos de dados distintos, até mesmo em DBMS’s diferentes, que precisam estabelecer relações entre si de uma maneira performática, sem impactar diretamente na maneira como a sua API devolve o resultado para o usuário. Ou em outro caso, onde você tenha uma API que vai ser utilizada tanto por uma plataforma web, quanto mobile, e você deseja poupar um pouco o plano de dados do usuário mobile, enviando apenas as informações que forem realmente necessárias.

Em termos, o GraphQL é uma ferramenta que faz com que as requisições feitas para uma API consigam dizer quais dados elas querem receber de retorno (isso pode parecer muito estranho no primeiro momento, mas logo a ideia começa a fazer um pouco mais de sentido). Eu trabalho há dois anos como desenvolvedor mobile, e já fiquei na mão muitas vezes porque aquele “id” do item “x” não estava vindo na resposta da API. Ou seja, eu ficava sempre dependendo do que o desenvolvedor back-end instruía para que a API me mandasse, e se não mandasse, eu tinha que pedir para que ele adicionasse determinado dado na resposta, e aguardasse ansiosamente pelo deploy, dessa forma, perdendo bastante tempo de desenvolvimento atoa.

O GraphQL se resume em dois tipos: queries e mutations. O GraphQL utiliza sua própria terminologia para que você realize essas queries e mutations. As queries são responsáveis por trazer as informações que você precisa de determinado campo já previamente declarado na tipologia do GraphQL. Por exemplo, se quisermos listar todos os usuários do banco com nome, idade e CPF, faríamos uma query mais ou menos assim:

Como eu já havia dito, você pode remover qualquer campo dessa consulta: você pode pedir só nome e idade, só CPF, só nome, que os dados virão de acordo com o que você pedir.

Além disso, nas queries também é possível pedir um campo relacionado, e declarar igualmente quais dados dele você precisa:

Quanto às mutations, elas são responsáveis por adicionar, alterar e excluir registros do banco. Caso eu queira adicionar um usuário eu faço algo parecido com isto:

Caso eu queira alterar:

GraphQL ainda dá suporte para middlewares, caso você precise adicionar algum para autenticar o usuário que faz o request, ou gerenciar suas permissões. Os resultados têm sido muito satisfatórios pra mim, e pretendo escrever logo sobre como o GraphQL vai se sair no ambiente de produção.