coldwa.st
Todos os guiasProgramaçãoWebDadosFerramentasBases de dadosHaskellConceitosCabal e buildsToolchainCompiladorDesempenhoEditor e HLS

Programação · web · API

REST vs GraphQL

Por ColdwastAtualizado a 17 de junho de 20268 min de leitura#api#rest#graphql
Um portátil a mostrar código de folha de estilos num editor de tema escuro
Dois estilos de API, um mesmo trabalho — expor dados via HTTP. REST e GraphQL diferem apenas em quem decide a forma da resposta.

Estás a construir uma API e a primeira grande bifurcação é o estilo: REST ou GraphQL. Resolvem o mesmo problema — deixar os clientes ler e escrever dados via HTTP — mas colocam o controlo em mãos diferentes. Este guia compara-os honestamente quanto à obtenção de dados, cache, complexidade e tooling, para escolheres com conhecimento de causa.

A diferença fundamental

  • REST — muitos endpoints (URLs), cada um devolvendo uma forma fixa de dados. Chamas /users/42 e obténs o que esse endpoint foi feito para devolver. É o servidor que decide a forma.
  • GraphQL — um único endpoint ao qual o cliente envia uma query que nomeia exatamente os campos que quer, e recebe apenas esses. É o cliente que decide a forma.

Ambos passam por HTTP e falam, em geral, JSON. A diferença: quem controla o que volta.

O mesmo pedido, das duas formas

Obter o nome de um utilizador e os títulos dos seus posts. Em REST são muitas vezes duas chamadas; em GraphQL uma query precisa:

-- REST (muitas vezes duas idas e voltas)
GET /users/42
GET /users/42/posts

-- GraphQL (uma query, campos exatos)
POST /graphql
{ user(id: 42) { name posts { title } } }
Uma pessoa a digitar num computador de secretária a mostrar código-fonte
A escolha é um compromisso de design, não um vencedor — depende da variedade das necessidades de dados dos teus clientes.

Over-fetching e under-fetching

É o argumento principal do GraphQL. Com as respostas fixas do REST, encontras muitas vezes:

  • O over-fetching — o endpoint devolve muito mais do que o necessário (dezenas de campos para mostrar um nome).
  • O under-fetching — um endpoint não chega, fazes várias outras chamadas para construir um ecrã.

O GraphQL evita os dois: o cliente pede exatamente os campos que quer, numa única query. Para apps com muitos ecrãs (sobretudo móveis), essa precisão é a principal razão de adoção.

Onde o REST ainda ganha

  • Cache — URLs distintos + GET fazem o REST funcionar naturalmente com as caches HTTP e as CDN. O GraphQL (POST para um endpoint) precisa de uma cache cliente ou de queries persistidas.
  • Simplicidade — para dados orientados a recursos, o REST tem menos a aprender e a operar; sem esquema, resolvers nem limites de custo de query.
  • Tooling e ubiquidade — o REST está em todo o lado, com um tooling maduro e gratuito e uma curva de aprendizagem suave.

Onde o GraphQL ganha

  • Dados flexíveis e precisos — os clientes obtêm exatamente aquilo de que precisam, nada mais.
  • Menos idas e voltas — dados ligados numa única query em vez de várias chamadas.
  • Um esquema tipado — um contrato autodocumentado e um tooling poderoso (introspeção, codegen).

O custo: mais complexidade no servidor (esquema, resolvers, proteção contra queries dispendiosas) e uma cache para desenhar em vez de obtida de graça.

Recomendado

Um sítio para alojar a tua API

REST ou GraphQL, a tua API precisa de um sítio fiável onde viver. Um VPS ou servidor cloud dá-te o controlo total do runtime, da base de dados e da cache. A Infomaniak — um alojamento suíço, respeitador da privacidade — oferece VPS e servidores cloud adequados.

Ver a cloud Infomaniak →

Ligação de afiliado — apoia estes guias gratuitos.

Como escolher

  • Escolhe REST para APIs mais simples, orientadas a recursos, em que a cache HTTP gratuita, a ubiquidade e uma curva suave contam.
  • Escolhe GraphQL quando os clientes têm necessidades de dados variadas e em evolução e queres evitar o over/under-fetching — e consegues absorver a complexidade extra no servidor.
  • Ambos é válido — muitos sistemas expõem REST para o acesso simples/público e GraphQL para as apps cliente ricas.

Perguntas frequentes

Qual é a diferença entre REST e GraphQL?

REST e GraphQL são dois estilos para construir uma API web. Uma API REST expõe muitos URLs (endpoints), cada um devolvendo uma forma de dados fixa — chamas /users/42 e obténs o que esse endpoint devolve. GraphQL expõe um único endpoint ao qual o cliente envia uma query que descreve exatamente os campos que quer, e recebe apenas esses. Em suma: com REST o servidor decide a forma da resposta por endpoint; com GraphQL decide-a o cliente por query. Ambos passam por HTTP e trocam, em geral, JSON.

O GraphQL é melhor do que o REST?

Nenhum é universalmente melhor — fazem compromissos diferentes. O GraphQL brilha quando os clientes precisam de dados flexíveis e precisos (ex.: ecrãs móveis variados) porque evita o over-fetching e o under-fetching e agrupa várias chamadas numa única query. O REST brilha em APIs simples orientadas a recursos e beneficia de uma cache HTTP gratuita e madura e de um tooling sólido. O GraphQL acrescenta complexidade no servidor (esquema, resolvers, controlo do custo das queries); o REST pode exigir várias idas e voltas. Escolhe consoante as necessidades de dados dos teus clientes, não a moda.

O que é o over-fetching e o under-fetching?

O over-fetching é quando um endpoint devolve mais dados do que o necessário — pedes um utilizador e recebes dezenas de campos para mostrar apenas um nome, desperdiçando largura de banda. O under-fetching é quando um endpoint não devolve o suficiente, obrigando-te a várias chamadas para montar o que um ecrã pede. O REST está sujeito a isso porque cada endpoint tem uma resposta fixa. O GraphQL evita ambos ao deixar o cliente pedir exatamente os campos que quer numa única query — é o seu principal atrativo.

REST ou GraphQL: qual fica melhor em cache?

O REST é geralmente mais simples de pôr em cache. Como o REST usa URLs distintos e métodos HTTP (sobretudo GET para leituras), funciona naturalmente com a cache HTTP, as CDN e a cache do navegador indexadas no URL. O GraphQL envia, em geral, as queries em POST para um único endpoint, pelo que a cache HTTP padrão não se aplica logo, e apoias-te numa cache do lado do cliente (como o Apollo) ou em queries persistidas. Se uma cache HTTP padrão e gratuita conta muito para ti, é um ponto a favor do REST.

Em resumo

REST e GraphQL não são inimigos — são duas respostas a «quem decide a forma da resposta?». O REST mantém-na do lado do servidor com endpoints simples e cacheáveis; o GraphQL confia-a ao cliente para queries precisas e flexíveis, ao preço de uma complexidade acrescida. Escolhe consoante as necessidades de dados dos teus clientes e o teu apetite por complexidade operacional — e lembra-te de que podes usar ambos onde cada um for adequado.