GraphQL é uma linguagem de consulta de código aberto para APIs que permite buscar dados de várias fontes em uma única chamada de API. Ela também funciona como um ambiente de execução no lado do servidor para atender a consultas usando dados existentes. O GraphQL prioriza fornecer ao cliente apenas os dados solicitados, sem deixar de oferecer uma descrição completa dos dados da API, além de facilitar o dimensionamento e a evolução das APIs.

Entendendo o GraphQL

O GraphQL foi projetado tendo em mente a flexibilidade, a velocidade e os desenvolvedores. Com o GraphQL, os desenvolvedores podem criar APIs da maneira que considerarem mais adequada e, em seguida, usar uma especificação GraphQL para garantir que elas funcionem corretamente para os clientes.

Um dos principais conceitos de uma consulta GraphQL é que os dados recebidos são previsíveis. Em vez de sequências de código desnecessário, o retorno contém exatamente o que foi solicitado. Essa busca declarativa de dados é especialmente útil em dispositivos móveis, nos quais a largura de banda é limitada. Os aplicativos que usam GraphQL também são estáveis e rápidos porque controlam os dados solicitados e recebidos, em vez de deixar esse controle a cargo do servidor. Eles também são rápidos mesmo em conexões de rede lentas, pois uma única solicitação pode retornar vários itens solicitados de uma só vez.

Com base na simplificação de dados proporcionada pelo GraphQL, as APIs são organizadas por tipos e campos, em vez de endpoints. Isso significa que todos os dados podem ser acessados por um único endpoint, permitindo que os aplicativos solicitem apenas o necessário. Ao reduzir a complexidade operacional, o GraphQL se integra ao fluxo de trabalho de uma solução simplificada de conectividade de APIs.

Uma breve história

Em 2012, a Meta (então Facebook) precisava de uma API de busca de dados que fosse avançada o suficiente para seus aplicativos móveis do Facebook. Sob a liderança de Lee Byron, o Facebook desenvolveu o GraphQL como uma forma de simplificar a busca de dados — especificamente, do ponto de vista de designers de produto e desenvolvedores. O GraphQL foi usado inicialmente de forma interna pelo Facebook e, em 2015, foi lançado publicamente como código aberto. Seguindo a trajetória de muitos outros projetos de código aberto, em 2019 o projeto GraphQL passou a fazer parte de sua própria GraphQL Foundation, hospedada pela Linux Foundation.

O GraphQL foi projetado como uma alternativa à arquitetura REST. As APIs REST padrão exigem o carregamento de informações de vários URLs por meio de solicitações HTTP GET separadas. Com as APIs GraphQL, todos os dados são recuperados por meio de uma única solicitação POST. Embora tanto o REST quanto o GraphQL retornem respostas no formato JSON, o GraphQL se concentra em simplificar e consolidar os dados.

Como o GraphQL funciona?

O GraphQL oferece suporte a solicitações de dados granulares e dá aos clientes mais controle sobre quais informações são enviadas. O cliente envia uma consulta GraphQL na forma de uma solicitação POST, à qual o servidor retorna uma resposta em formato JSON. O GraphQL não exige uma arquitetura de aplicação específica, pode ser implantado em vários ambientes (incluindo um ambiente de desenvolvimento integrado [IDE]) e pode ser usado com ferramentas existentes de gerenciamento de APIs ou sobre APIs REST existentes.

Alguns dos principais termos do GraphQL incluem:

  • Esquema – Criados por desenvolvedores de APIs para mostrar quais dados os clientes podem consultar, os esquemas são compostos por tipos de objetos que definem o que um cliente pode solicitar e pelos campos que representam as características do objeto.
  • Consulta – As consultas são validadas e, em seguida, executadas com base no esquema. O GraphQL não pode executar uma consulta sem que um tipo de objeto seja definido.
  • Resolver – As funções de resolução associadas a cada campo do esquema são chamadas para produzir um valor durante a execução da API. Os resolvers são componentes arquiteturais essenciais do GraphQL.

Um recurso exclusivo do GraphQL é que as respostas refletem a estrutura da consulta (que, por sua vez, é definida pelo esquema). Isso simplifica a análise pelo cliente, pois o formato da resposta do servidor é totalmente previsível.

Design

A natureza hierárquica do GraphQL acompanha as relações entre objetos e funciona bem em interfaces de usuário hierárquicas. Ele também possui tipagem forte, o que significa que cada nível da consulta corresponde a um tipo. Esses tipos, por sua vez, definem um conjunto de campos. Isso é semelhante ao SQL, em que mensagens de erro descritivas são exibidas antes da conclusão de uma consulta.

Conecte os resolvers às fontes de dados

Os resolvers são os principais módulos arquiteturais que conectam campos, arestas, mutações, consultas e assinaturas do GraphQL a fontes de dados (e microsserviços).

Você pode aprender a criar resolvedores para fontes de dados da AWS neste tutorial de GraphQL.

Especifique o que buscar

Um dos aspectos que tornam as consultas GraphQL únicas são as respostas espelhadas. Os dados retornados por uma consulta tornam-se previsíveis, pois você sabe que eles corresponderão à estrutura da solicitação à API. Quando a estrutura dos dados retornados segue a consulta do cliente, os servidores se tornam mais simples.

Vantagens do GraphQL

Um dos principais benefícios do GraphQL é a disponibilidade de extensões que oferecem recursos não disponíveis no REST. Outras vantagens do GraphQL incluem as seguintes.

Estabelece uma única fonte da verdade

Um esquema GraphQL estabelece uma única fonte de verdade em aplicações GraphQL, fornecendo um local central onde todos os dados são descritos. Embora o esquema GraphQL geralmente seja definido no servidor, os clientes ainda podem consultar e gravar dados com base no esquema.

Sem busca excessiva de dados

Em arquiteturas REST, o excesso de dados retornados (overfetching) pode rapidamente se tornar um problema: a aplicação (backend) define os dados disponíveis para cada recurso e retorna todos eles na resposta, mesmo que o cliente (frontend) precise de apenas um único elemento. As chamadas GraphQL são realizadas em uma única requisição e fornecem aos clientes os dados solicitados sem retornar dados em excesso.

Comunicação aprimorada entre cliente e servidor

Como os tipos de dados são fortemente definidos, a comunicação entre cliente e servidor é mais clara no GraphQL do que no REST. Essa estrutura subjacente também significa que não são necessários clientes complexos para fazer chamadas a um servidor GraphQL. Para saber mais e ver o código em ação, leia sobre clientes e servidores na página oficial do GraphQL.

Escalável com Federation

Como um conjunto de princípios de design e ferramentas, a Federação de APIs possibilita expor serviços dentro de um contexto delimitado como uma API consistente para os usuários, ao mesmo tempo que permite que os serviços nesse contexto evoluam sem restrições. O GraphQL oferece um método para federar toda a API e evoluí-la sem invalidar consultas anteriores, tornando-a escalável — e essa escalabilidade é um dos motivos pelos quais o GraphQL é usado por muitas empresas.

Introspecção

A natureza introspectiva do GraphQL permite recuperar o esquema GraphQL de uma API GraphQL. Os clientes também podem solicitar uma lista dos tipos de dados disponíveis, o que é ideal para gerar documentação automaticamente e para testar ou recuperar esquemas de vários microsserviços.

Desvantagens do GraphQL

Embora existam muitos motivos para adotar o GraphQL, também há algumas desvantagens que devem ser consideradas. Por exemplo, nem tudo funciona de imediato: são necessárias bibliotecas específicas para consumir a API de terceiros. Além disso, de modo geral, o GraphQL exige um suporte de ferramentas mais robusto do que o REST.

As desvantagens do GraphQL em comparação com REST incluem as seguintes.

Curva de aprendizado

Para desenvolvedores acostumados com APIs REST, o GraphQL apresenta uma curva de aprendizado mais acentuada. Ele também pode mudar o fluxo de trabalho — as equipes de API que usam GraphQL também precisam criar esquemas GraphQL fáceis de manter. Dito isso, ao começar do zero, o GraphQL pode ser fácil de aprender e usar, pois as solicitações e as respostas têm a mesma estrutura.

Estratégias exclusivas de gerenciamento de APIs

O GraphQL pode exigir novas estratégias de gerenciamento de APIs, enquanto as APIs REST tendem a se adequar aos modelos de gerenciamento de APIs existentes. É importante levar isso em consideração, pois a adoção de uma nova estratégia de gerenciamento de APIs pode aumentar os custos gerais.

Cache complexo

O cache é menos simples no GraphQL do que no REST, em que as solicitações geralmente usam um método HTTP (GET, POST, PUT ou DELETE). Uma solicitação GraphQL padrão usa POST, que não pode ser armazenado em cache no nível HTTP. O cache também pode se tornar complexo no GraphQL porque ter um único endpoint significa que a URL desse endpoint produz várias respostas diferentes que não podem ser armazenadas em cache (bom para buscar dados, ruim para o cache). Com isso, os desenvolvedores de servidores acabam tendo que diferenciar as consultas, embora cada uma opere dentro do mesmo objeto. Dito isso, muitas bibliotecas GraphQL oferecem mecanismos de cache prontos para uso.