GraphQL vs. REST API
Explore as principais diferenças entre GraphQL e REST APIs, as suas vantagens e quando utilizar cada uma para um desenvolvimento web otimizado.
Já trabalhaste num projeto de desenvolvimento de aplicações web antes? Se sim, então talvez já tenhas encontrado o termo "GraphQL". Mas o que significa exatamente? É usado em configurações do lado do servidor ou do cliente? Além disso, quando é que a integração com GraphQL é preferível a outras alternativas? Neste artigo, vamos guiar-te através destas questões.
Como um canal de comunicação para transferência de dados entre componentes de software pela internet, as APIs desempenham um papel indispensável nas arquiteturas modernas de serviços web, agindo como oxigênio. Tecnologias de API, como SOAP (um protocolo de mensagens para serviços web), REST (estilo arquitetónico) e GraphQL (uma linguagem de consulta e ferramenta) facilitam o desenvolvimento de software ao suportar a integração e troca de dados entre diferentes serviços, tornando o desenvolvimento mais conveniente e flexível.
Apesar dos inúmeros tipos de APIs, os debates nos últimos anos têm-se centrado predominantemente em dois principais paradigmas: REST (transferência de estado representacional) e GraphQL. Ambos oferecem uma gama de vantagens e são usados globalmente em projetos web. No entanto, eles diferem significativamente na forma como gerem a comunicação de dados.
O que é REST API?
REST é um estilo arquitetónico estruturado desenvolvido no início do século XXI para construir aplicações hipermédia entre redes, projetado para adotar um protocolo de comunicação sem estado e cacheável entre clientes e servidores. A REST API (também conhecida como API RESTful) é o motor da arquitetura REST.
REST API usa Identificadores Uniformes de Recursos (URIs) para endereçar recursos. A REST API funciona utilizando diferentes endpoints para realizar operações CRUD (criar, ler, atualizar e deletar) em recursos de rede. Baseia-se em formatos de dados predefinidos (conhecidos como tipos de mídia ou tipos MIME) para determinar a forma e o tamanho dos recursos que fornecem aos clientes. Os formatos mais comuns são JSON e XML (às vezes HTML ou texto simples).
Após o cliente solicitar um recurso, o servidor processa a consulta e retorna todos os dados relacionados a esse recurso. A resposta contém códigos de resposta HTTP, como "200 OK" (para uma solicitação REST bem-sucedida) e "404 Not Found" (para um recurso inexistente).
Como funciona a REST API?
As REST APIs dependem de endpoints predefinidos que expõem recursos via HTTP. Cada endpoint representa um recurso, como utilizadores ou publicações, e é identificado por uma URL única. As operações REST estão vinculadas a métodos HTTP padrão, como GET, POST, PUT e DELETE, que correspondem à recuperação, criação, atualização e exclusão de dados.
Por exemplo, uma solicitação para GET /users
recupera uma lista completa de utilizadores, enquanto GET /users/123
busca os detalhes de um utilizador específico identificado pelo seu ID. Se também precisares de aceder a dados relacionados, como as organizações e papéis de organização do utilizador, precisarias de fazer chamadas adicionais para GET /users/123/organizations
.
O REST segue uma abordagem centrada em recursos, focando no acesso e manipulação de recursos discretos.
O que é GraphQL?
GraphQL é tanto um tipo de API (ou linguagem de consulta) como um motor de tempo de execução para responder a essas consultas. Oferece uma API simplificada e é particularmente adequado para aplicações móveis e a implementação de arquiteturas complexas que requerem subconjuntos específicos de dados.
Com GraphQL, os desenvolvedores podem especificar os dados que querem recuperar da API. Também permite a recuperação de dados sob demanda em vez de buscar tudo de uma vez, aplica mudanças imediatamente e integra fontes de dados de terceiros na aplicação.
As aplicações podem usar consultas GraphQL para chamar serviços GraphQL. Estas consultas retornam os elementos de dados exatos solicitados pelo cliente. Isso economiza múltiplas chamadas de API, largura de banda de rede e pós-processamento. É uma solução altamente eficiente para APIs centradas em dados que estão localizadas perto de dispositivos consumidores, como tablets e telemóveis.
Como funciona o GraphQL?
GraphQL, em contraste, adota uma abordagem baseada em consultas. Em vez de endpoints predefinidos, o GraphQL expõe um único endpoint que aceita consultas estruturadas. Os clientes especificam precisamente quais dados precisam usando uma linguagem de consulta.
Portanto, uma implementação completa de GraphQL deve ter duas partes: esquema e resolvers.
Esquema do GraphQL
Os esquemas definem os tipos de dados e os seus campos que podem ser recuperados através de consultas GraphQL:
Por exemplo, suponha que tens o seguinte esquema:
Um cliente pode consultar o nome de um utilizador, e-mail, organizações e papéis usando a seguinte consulta:
Esta consulta não só obtém apenas os campos solicitados (e-mail, e organizações), como também recupera os dados relacionados (papéis) numa única solicitação.
Resolver do GraphQL
Um resolver de GraphQL é um componente-chave num servidor GraphQL que determina como buscar ou calcular os dados solicitados por um cliente numa consulta GraphQL. Quando um cliente envia uma consulta, cada campo na consulta é correspondido a um resolver, que contém a lógica para recuperar ou calcular os dados para esse campo.
No exemplo acima, os resolvers para o esquema seriam assim:
Existem dois tipos de resolvers: resolvers raiz e resolvers de campo.
- Resolvers Raiz: Lidam com campos de nível superior no esquema, como Query, Mutation e Subscription.
- Resolvers de Campo: Lidam com campos individuais dentro de um tipo, muitas vezes para consultas aninhadas. Se nenhum resolver específico for fornecido para um campo, o GraphQL usa o resolver padrão, que retorna o valor do objeto pai com o nome de campo correspondente.
Operações do GraphQL
GraphQL suporta três tipos de operações: consultas, mutações e assinaturas.
Query
: Usada para LER dados.Mutation
: Usada para ESCREVER dados, incluindo operações para adicionar, modificar e deletar dados.Subscription
: Usada para solicitar uma conexão persistente para dados, permitindo que o cliente declare os tipos de eventos em que está interessado e os dados que devem ser retornados.
Diferenças entre GraphQL e REST APIs
GraphQL e REST APIs são ferramentas para troca de dados entre diferentes serviços web, mas devido às suas diferentes abordagens para resolver problemas, aqui estão as principais diferenças entre eles:
Obtenção de dados
A REST API frequentemente sobrecarrega ou subutiliza dados, pois os endpoints retornam respostas fixas. O GraphQL resolve isso permitindo que os clientes solicitem exatamente o que precisam, reduzindo a transferência de dados desnecessária. Isso torna o GraphQL ideal para aplicações com necessidades de dados complexas, como ambientes móveis ou de baixa largura de banda.
Imagina o exemplo acima em que precisas de buscar dados estáticos de um utilizador, organizações e papéis de organização atribuídos ao utilizador. Com a REST API, precisarias de fazer várias solicitações a diferentes endpoints para obter todos os dados. No entanto, com GraphQL, podes buscar todos os dados numa única solicitação.
Flexibilidade
A estrutura baseada em endpoint do REST é direta e funciona bem para aplicações simples com operações CRUD padrão. Isto porque as REST APIs são projetadas para serem centradas em recursos, com cada endpoint representando um recurso específico. A principal limitação desta abordagem é que ela não permite uma rápida iteração e mudanças nos requisitos do cliente. Com cada mudança feita no cliente, o servidor deve ser atualizado para acomodar os novos requisitos, seja através da adição de novos endpoints ou atualização dos existentes. Isso muitas vezes resulta em muitos endpoints redundantes e uma gestão complexa de versões de API.
O GraphQL, por outro lado, é mais flexível e permite que os clientes solicitem apenas os dados que precisam. Esta flexibilidade é particularmente útil quando os requisitos dos clientes mudam frequentemente, pois elimina a necessidade de modificar a implementação da API do lado do servidor. Os clientes podem solicitar novos campos ou dados aninhados sem exigir mudanças no servidor.
Caching
Embora o GraphQL seja mais eficiente e flexível em termos de obtenção de dados, também tem algumas desvantagens. Um dos principais problemas é o caching.
A REST API tem um ecossistema maduro. Devido à sua natureza sem estado e padronizada, é fácil cachear respostas tanto no nível do servidor quanto no nível do cliente. Isso pode reduzir significativamente o número de solicitações feitas ao servidor e melhorar o desempenho.
No entanto, devido à sua flexibilidade, muitas das tecnologias de caching disponíveis para a REST API não são aplicáveis ao GraphQL. É necessário lidar com o caching no lado do cliente, com base em casos de uso específicos, o que traz uma carga extra para o desenvolvimento do cliente.
Prós e Contras
Nome | Prós | Contras |
---|---|---|
REST API | - Simples e amplamente adotada, com ferramentas extensas e suporte comunitário. - Estrutura clara, tornando-a fácil para iniciantes entenderem. - Suporte embutido para caching usando padrões HTTP. | - Sobrecarregamento ou subutilização de dados - Mudanças costumam requerer a criação de novas versões, aumentando a sobrecarga de manutenção. |
GraphQL | - Obtenção precisa de dados melhora o desempenho e eficiência. - Evolução de esquema reduz a necessidade de versionamento. - Ferramentas poderosas, como introspecção e verificação de tipos, melhoram a experiência de desenvolvimento. | - Configuração mais complexa e curva de aprendizado comparado ao REST. - Requer soluções de caching personalizadas, pois não depende de caching HTTP. - Design de único endpoint pode complicar a depuração e monitoramento. |
Conclusão
Embora o GraphQL tenha ganhado um forte impulso como um recém-chegado nos últimos anos, a REST API ainda mantém uma importância significativa por um longo tempo devido ao seu design atômico e rigoroso.
REST e GraphQL atendem a necessidades diferentes e se destacam em diferentes cenários. A simplicidade do REST o torna uma escolha perfeita para aplicações diretas e microservices. O GraphQL se destaca em cenários que requerem recuperação de dados flexível e eficiente, particularmente em aplicações com clientes diversos ou complexas relações entre dados. A escolha entre os dois depende dos requisitos específicos do teu projeto, da experiência da tua equipa e das necessidades de escalabilidade a longo prazo.