REST vs GraphQL: qual usar na sua API?
Ao construir uma API, uma das decisĂ”es mais importantes Ă© escolher o estilo arquitetural. Por anos, o REST dominou o mercado. Mais recentemente, o GraphQL â criado pelo Facebook em 2012 e aberto ao pĂșblico em 2015 â ganhou força como alternativa. Mas qual usar?
O que Ă© REST?
REST (Representational State Transfer) Ă© um conjunto de convençÔes arquiteturais baseado em endpoints HTTP. Cada recurso tem sua prĂłpria URL e vocĂȘ interage com ele usando os verbos HTTP: GET, POST, PUT, DELETE.
POST /usuarios # cria usuĂĄrio
GET /usuarios/42/pedidos # busca pedidos do usuĂĄrio
O que Ă© GraphQL?
GraphQL Ă© uma linguagem de consulta para APIs. Em vez de mĂșltiplos endpoints, existe apenas um â geralmente /graphql. O cliente descreve exatamente os dados que precisa na prĂłpria requisição.
usuario(id: 42) {{'{'}}
nome
pedidos {{'{'}} total status {{'}'}}
{{'}'}}
{{'}'}}
Comparação direta
| Critério | REST | GraphQL |
|---|---|---|
| Curva de aprendizado | Baixa | Média |
| Over-fetching | Comum | Eliminado |
| MĂșltiplos recursos | N chamadas | 1 chamada |
| Cache HTTP nativo | Sim | Complexo |
| Ideal para | APIs pĂșblicas simples | Apps com muitas telas |
Quando usar cada um?
Use REST quando: sua API Ă© pĂșblica e consumida por terceiros, a equipe Ă© pequena e prefere simplicidade, ou vocĂȘ precisa de cache HTTP nativo.
Use GraphQL quando: seu frontend tem muitas telas com necessidades de dados diferentes (ex: app mobile vs web), vocĂȘ quer evitar mĂșltiplas chamadas, ou estĂĄ construindo um BFF (Backend for Frontend).
GraphQL na prĂĄtica: como montar um servidor
Com Node.js e a biblioteca Apollo Server, vocĂȘ pode ter um servidor GraphQL rodando em minutos:
// Definição do schema (contrato da API)
const typeDefs = `#graphql
type Usuario {{'{'}} id: ID, nome: String, email: String {{'}'}}
type Query {{'{'}} usuario(id: ID!): Usuario {{'}'}}
`;
// Resolvers (onde a lĂłgica vive)
const resolvers = {{'{'}} Query: {{'{'}} usuario: (_, {{'{'}}id{{'}'}}) => buscarUsuario(id) {{'}'}}
{{'}'}};
O problema do over-fetching no REST
Imagine que vocĂȘ tem uma tela de perfil no app mobile que precisa apenas do nome e foto do usuĂĄrio. Com REST, a chamada GET /usuarios/42 retorna todos os campos â CPF, endereço, histĂłrico de compras, configuraçÔes. Isso Ă© over-fetching: vocĂȘ recebe muito mais do que precisa, desperdiçando banda (crĂtico em mobile) e aumentando o tempo de parsing.
Com GraphQL, vocĂȘ pede exatamente nome e fotoPerfil e recebe apenas esses dois campos.
tRPC: uma terceira opção para TypeScript
Para projetos full-stack em TypeScript, o tRPC Ă© uma alternativa interessante que combina o melhor dos dois mundos: tipagem end-to-end automĂĄtica (sem schema manual como no GraphQL) e simplicidade de REST. O cliente e o servidor compartilham os mesmos tipos TypeScript, eliminando completamente a necessidade de escrever schemas separados ou gerar cĂłdigo.
Adoção no mercado
GitHub, Shopify, Twitter e Facebook usam GraphQL em produção. Mas grandes APIs pĂșblicas como Stripe, Twilio e a maioria dos serviços de pagamento ainda usam REST. A tendĂȘncia para novos projetos com frontends complexos Ă© GraphQL, mas REST estĂĄ longe de morrer â especialmente para integraçÔes B2B e APIs pĂșblicas simples.
ConclusĂŁo
NĂŁo hĂĄ resposta errada â hĂĄ a resposta certa para o seu contexto. Para projetos novos com frontends complexos e mobile, GraphQL vale o investimento. Para APIs simples, REST ainda Ă© a escolha mais pragmĂĄtica e amplamente suportada.