Onde eu estava que não conhecia GraphQL

Você também não conhecia? GraphQL é uma linguagem consideravelmente nova para consultas em APIs e descrição de recursos, utilizada por grandes empresas de tecnologia.

Histórico

Lançamento

GraphQL foi uma linguagem criada pelo Facebook, e mantida somente pela empresa até meados de 2015, quando foi anunciada junto com o Relay (Primeiro client para GraphQL).

Então se você utiliza o aplicativo do Facebook, você é um usuário de GraphQL desde 2013, quando a proposta de manter aplicativos em HTML para iOS e Android foi deixada de lado por parte do Facebook.

Um post mais detalhado do surgimento do GraphQL e do Relay você pode encontrar neste link.

Facebook + Comunidade

Ferramentas como React, Relay e GraphQL foram feitas com o mesmo propósito, gerar Aplicações client-side totalmente desacopladas, UI rápidas e de alta qualidade, para o Facebook. Então todas essas ferramentas se completam e fazem sentidos em aplicações com interações com o usuário.

O Facebook tem um papel muito importante e ótimas decisões quanto ao desenvolvimento de open-source em torno destas ferramentas. Logo com a popularidade do React, a empresa focou em liberar mais e mais ferramentas para a comunidade utilizar e aperfeiçoar as mesmas.

Depois dessa abertura de portas por parte do Facebook, a comunidade que já estava utilizando o React adotou a ideia, e começou a engajar-se em novas bibliotecas e ferramentas para o GraphQL.

Hoje

Já são inúmeras empresas de ponta utilizando desta linguagem em suas aplicações nomes como New York Times, Shopify, Twitter, entre outros. Mas a que chamou a atenção de muitos desenvolvedores ao redor do mundo foi a versão 4 da API do Github, que me despertou o interesse de conhecer melhor está linguagem e difundir o conhecimento por meio deste post. 😘


Conceitos básicos

GraphQL é uma linguagem de consulta para sua aplicação, provendo pelo server-side uma abstração de seus recursos para descrever como montar sua consulta e garantir o resultado.

Além disto GraphQL não é uma linguagem com poder computacional, ou seja a linguagem necessita de uma biblioteca que faça o mapeamento de seus recursos e que siga as filosofias de sua especificação técnica. Já existem muitas bibliotecas escritas para isto, e em muitas linguagens difundidas no mercado, tanto para o client-side, como para o server-side.

Todas estas bibliotecas são open source. Um ponto para a comunidade. 👍

Schemas e Types

O esquema e tipos de sua API GraphQL são tratados no server-side, e são onde você define o que pode ser requisitado de seu servidor e como irá ser requisitado. Existe uma vasta variedade de tipos pré-definidos pelo GraphQL.

Exemplo de um tipo em Ruby

Um exemplo de uma API em GraphQL que abstrai um endpoint de uma API pública da riotgames, o código mais detalhado pode ser encontrado no meu Github: https://github.com/viniciuspalma/vayne.

Para aprender mais sobre Schemas e Types acesse esse link do site oficial.

Queries e Mutations

Consultas e mutações são executadas a partir do client-side e são a base para fazer requests de dados ao servidor e atualizações em seus recursos. Consultas são basicamente a forma de requisitar dados de um certo recurso, ou até mesmo do próprio Schema. Já as mutações é o modo com que você altera seus recursos, se entende alterar como exclusão, atualização e criação de recursos.

Exemplo de uma consulta e seu resultado com GraphQL.

Este exemplo de consulta se refere ao mesmo schema acima e de mesmo projeto. É um exemplo em Ruby mas como mencionei existem bibliotecas nas mais variadas linguagens.

Dentro de consultas existem algumas “ferramentas” que lhe ajudam com o reaproveitamento de código como os Fragments e as Variables que armazenam informações em tempo de execução. Além disto as citadas acima são somente duas de várias outras encontradas nesta sessão do site oficial.


Conclusão

Depois de estudar a linguagem e utilizar em alguns projetos pessoais, busquei encontrar as principais vantagens de desenvolver um aplicação com GraphQL, para poder comparar com APIs já existentes que eu já trabalhei e ou trabalho atualmente (frequentemente APIs REST). Com está comparação levantei alguns pontos em que APIs com GraphQL se sobressaem.
Aqui estão eles:

Documentação no GraphQL pode ser feito fazendo requests a ele mesmo o sistema introspectivo permite que a API se auto-analise, deste modo podemos fazer requests que o resultado seja os recursos disponíveis e campos disponíveis com seus respectivos tipos e validações. Isto torna a vida mais fácil para desenvolvedores que adentram em um projeto em andamento, diminuindo a curva de aprendizagem, tanto para o front-end e back-end. Mais sobre introspection neste link.

Versionamento, sua API não precisa mais ter um versionamento explícito para o client, para adicionar novos campos à consulta, apenas adicione e seu Schema irá refletir o resultado. Crie novas queries para abstrair novas lógicas em seus recursos, sempre sem afetar queries antigas.

A consulta feita para a API retorna exatamente o que foi solicitado nada menos e nada mais. Como o exemplo que eu mencionei na sessão de conceitos.

Desenvolvimento de uma API utilizando GraphQL faz com que cada recurso deve ter todos seus campos descritos e por ser uma linguagem de tipagem forte o tipo deve inferido. O que torna seu Schema auto-descritivo e organizado. Facilitando a escrita de testes e diminuindo a ocorrência de bugs.


Para maior conhecimento de GraphQL recomendo a leitura da sessão learn do site oficial, e também a leitura da especificação da linguagem propriamente dita, pois os assuntos abordados neste post são somente para uma ideia geral da linguagem, focando na apresentação e conceitos.