Resumo
Use REST para APIs públicas e operações CRUD simples. Use GraphQL quando os clientes precisam de busca de dados flexível e você deseja reduzir o excesso de busca de dados (over-fetching). Use gRPC para comunicação de microsserviços de alto desempenho. A Modern PetstoreAPI implementa todos os três protocolos, permitindo que você escolha a ferramenta certa para cada caso de uso.
Introdução
Você está construindo uma API. Você deve usar REST, GraphQL ou gRPC? Cada protocolo tem defensores apaixonados que afirmam que o seu é o melhor. A verdade: todos são bons em coisas diferentes.
REST é universal e simples. GraphQL dá aos clientes controle sobre a busca de dados. gRPC é rápido e eficiente para serviços internos. A melhor escolha depende do seu caso de uso, não de qual protocolo é "melhor".
A maioria das APIs escolhe um protocolo e se mantém a ele. A Modern PetstoreAPI adota uma abordagem diferente: ela implementa REST, GraphQL e gRPC, mostrando como a mesma API de pet shop funciona nos três protocolos.
Neste guia, você aprenderá os pontos fortes e fracos de cada protocolo, verá exemplos reais da Modern PetstoreAPI e descobrirá como escolher o protocolo certo para suas necessidades.
REST: O Padrão Universal
REST (Representational State Transfer) é o protocolo de API mais comum.
Como o REST Funciona
Recursos são acessados via URLs com métodos HTTP:
GET /pets - Listar pets
POST /pets - Criar pet
GET /pets/{id} - Obter pet
PUT /pets/{id} - Atualizar pet
DELETE /pets/{id} - Deletar pet
Exemplo de requisição:
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
Exemplo de resposta:
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99
}
Pontos Fortes do REST
1. Compatibilidade universal
Toda linguagem de programação possui bibliotecas HTTP. Navegadores, curl, Postman — tudo funciona com REST.
2. Simples de entender
URLs representam recursos. Métodos HTTP representam ações. O modelo mental é direto.
3. Armazenável em cache (Cacheable)
O cache HTTP funciona nativamente. Requisições GET podem ser armazenadas em cache por navegadores, CDNs e proxies.
4. Sem estado (Stateless)
Cada requisição é independente. Nenhum estado de sessão no servidor.
5. Ótimas ferramentas
Especificações OpenAPI, Swagger UI, ferramentas de teste de API — REST possui o melhor ecossistema.
Pontos Fracos do REST
1. Excesso de busca de dados (Over-fetching)
Você obtém todos os campos, mesmo que precise apenas de um:
// Você só precisa do nome, mas obtém tudo
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99,
"description": "...",
"images": [...],
"vaccinations": [...]
}
2. Insuficiência de busca de dados (Under-fetching / Problema N+1)
Para obter um animal de estimação e seus pedidos, você precisa de múltiplas requisições:
GET /pets/123 # Obter pet
GET /pets/123/orders # Obter pedidos
GET /orders/456/items # Obter itens do pedido
3. Complexidade de versionamento
Alterações que quebram a compatibilidade exigem novas versões da API (/v1, /v2).
4. Sem atualizações em tempo real
REST é requisição-resposta. Para dados em tempo real, você precisa de polling ou WebSockets.
Quando Usar REST
- APIs Públicas (compatibilidade máxima)
- Operações CRUD simples
- Quando o cache é importante
- Quando você precisa de amplo suporte de ferramentas
- Aplicativos móveis com necessidades de dados previsíveis
Implementação REST da Modern PetstoreAPI
GraphQL: Busca Flexível de Dados
GraphQL permite que os clientes especifiquem exatamente quais dados eles precisam.
Como o GraphQL Funciona
Endpoint único com uma linguagem de consulta:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
species
orders {
id
total
items {
product
quantity
}
}
}
}
Resposta:
{
"data": {
"pet": {
"name": "Fluffy",
"species": "CAT",
"orders": [
{
"id": "order-123",
"total": 49.99,
"items": [
{"product": "Comida de gato", "quantity": 2}
]
}
]
}
}
}
Pontos Fortes do GraphQL
1. Sem excesso de busca de dados (Over-fetching)
Os clientes solicitam apenas os campos de que precisam:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name # Obtenha apenas o nome
}
}
2. Sem insuficiência de busca de dados (Under-fetching)
Obtenha dados relacionados em uma única requisição:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
orders {
items {
product
}
}
}
}
Sem problema N+1.
3. Tipagem forte
Os schemas GraphQL são fortemente tipados. Os clientes sabem exatamente o que está disponível.
4. Introspecção
Os clientes podem consultar o schema para descobrir as operações disponíveis:
query {
__schema {
types {
name
fields {
name
type
}
}
}
}
5. Endpoint único
Todas as operações passam por uma única URL: /graphql
Pontos Fracos do GraphQL
1. Complexidade
GraphQL é mais difícil de aprender do que REST. Queries, mutations, subscriptions, resolvers — há mais para entender.
2. Cache é mais difícil
O cache HTTP não funciona bem. Você precisa de estratégias de cache personalizadas.
3. Risco de excesso de consultas (Over-querying)
Os clientes podem escrever consultas custosas:
query {
pets {
orders {
items {
product {
reviews {
author {
pets {
# Profundidade infinita!
}
}
}
}
}
}
}
}
Você precisa de limites de profundidade de consulta e análise de complexidade.
4. Upload de arquivos é desajeitado
GraphQL não foi projetado para upload de arquivos. Você precisa de soluções alternativas.
5. Monitoramento é mais difícil
Todas as requisições vão para /graphql. Você não pode monitorar por URL.
Quando Usar GraphQL
- Aplicativos móveis (reduzir largura de banda)
- Requisitos de dados complexos
- Quando os clientes precisam de flexibilidade
- APIs internas com clientes conhecidos
- Quando você deseja evitar o versionamento
Implementação GraphQL da Modern PetstoreAPI
gRPC: RPC de Alto Desempenho
gRPC usa Protocol Buffers para comunicação binária eficiente.
Como o gRPC Funciona
Defina serviços em arquivos .proto:
service PetService {
rpc GetPet(GetPetRequest) returns (Pet);
rpc ListPets(ListPetsRequest) returns (ListPetsResponse);
rpc CreatePet(CreatePetRequest) returns (Pet);
}
message Pet {
string id = 1;
string name = 2;
string species = 3;
PetStatus status = 4;
}
Código do cliente (gerado):
client := pb.NewPetServiceClient(conn)
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
Pontos Fortes do gRPC
1. Desempenho
Protocol Buffers são menores e mais rápidos que JSON:
- Payloads 3-10x menores
- Serialização 20-100x mais rápida
2. Streaming
Suporte integrado para streaming de servidor, streaming de cliente e streaming bidirecional:
rpc WatchPets(WatchPetsRequest) returns (stream Pet);
3. Tipagem forte
Protocol Buffers impõem tipos em tempo de compilação.
4. Geração de código
Gere código de cliente e servidor em mais de 10 linguagens a partir de arquivos .proto.
5. HTTP/2
Multiplexação, compressão de cabeçalho e server push.
Pontos Fracos do gRPC
1. Não amigável para navegadores
Navegadores não suportam streaming bidirecional HTTP/2. Você precisa de grpc-web (uma solução alternativa).
2. Não legível por humanos
Protocol Buffers são binários. Você não pode usar curl em um endpoint gRPC e ler a resposta.
3. Mais difícil de depurar
Protocolos binários são mais difíceis de inspecionar do que JSON.
4. Menos ferramentas
Menos ferramentas comparado ao REST. Nenhum equivalente ao Swagger UI.
5. Curva de aprendizado mais íngreme
Protocol Buffers, geração de código e conceitos de gRPC levam tempo para aprender.
Quando Usar gRPC
- Comunicação de microsserviços
- Requisitos de alto desempenho
- Streaming em tempo real
- APIs internas (não públicas)
- Ambientes poliglota (múltiplas linguagens)
Implementação gRPC da Modern PetstoreAPI
Comparação Lado a Lado
| Funcionalidade | REST | GraphQL | gRPC |
|---|---|---|---|
| Protocolo | HTTP/1.1 ou HTTP/2 | HTTP/1.1 ou HTTP/2 | Somente HTTP/2 |
| Formato de Dados | JSON (geralmente) | JSON | Protocol Buffers (binário) |
| Endpoints | Múltiplos (/pets, /orders) |
Único (/graphql) |
Métodos de serviço |
| Excesso de busca (Over-fetching) | Comum | Raro | N/A (você define as mensagens) |
| Insuficiência de busca (Under-fetching) | Comum (N+1) | Raro | N/A |
| Cache | Excelente (HTTP) | Ruim | Ruim |
| Suporte a Navegadores | Excelente | Excelente | Ruim (precisa de grpc-web) |
| Ferramentas | Excelente | Bom | Razoável |
| Curva de Aprendizado | Fácil | Médio | Difícil |
| Desempenho | Bom | Bom | Excelente |
| Streaming | Não (precisa de WebSocket) | Sim (assinaturas) | Sim (nativo) |
| Versionamento | URL ou cabeçalho | Evolução do schema | Evolução do proto |
| Melhor Para | APIs públicas, CRUD | Clientes flexíveis | Microsserviços |
Como a Modern PetstoreAPI Implementa os Três
A Modern PetstoreAPI é única: ela implementa a mesma API de pet shop em REST, GraphQL e gRPC.
Mesmos Dados, Três Protocolos
Obter um pet por ID:
REST:
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
GraphQL:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
id
name
species
}
}
gRPC:
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
Todos os três retornam os mesmos dados do pet.
Por Que Implementar os Três?
1. Aprender por comparação
Veja como as mesmas operações funcionam em diferentes protocolos.
2. Escolha a ferramenta certa
Use REST para endpoints públicos, GraphQL para aplicativos móveis, gRPC para serviços internos.
3. Caminho de migração
Comece com REST, adicione GraphQL ou gRPC mais tarde sem reescrever tudo.
4. Implementação de referência
A Modern PetstoreAPI mostra padrões prontos para produção para todos os três protocolos.
Confira o guia de comparação de protocolos para exemplos detalhados.
Testando APIs Multi-Protocolo com Apidog
O Apidog suporta REST, GraphQL e gRPC em uma única ferramenta.
Testando REST
Importe a especificação OpenAPI e execute testes automatizados:
pm.test("Status é 200", () => {
pm.response.to.have.status(200);
});
pm.test("O pet possui campos obrigatórios", () => {
const pet = pm.response.json();
pm.expect(pet).to.have.property('id');
pm.expect(pet).to.have.property('name');
});
Testando GraphQL
Escreva consultas GraphQL e valide as respostas:
query GetPet($id: ID!) {
pet(id: $id) {
id
name
species
}
}
Apidog valida em relação ao schema GraphQL.
Testando gRPC
Importe arquivos .proto e teste serviços gRPC:
service: PetService
method: GetPet
request: { "id": "019b4132-70aa-764f-b315-e2803d882a24" }
Apidog gera requisições a partir de definições de Protocol Buffer.
Teste Entre Protocolos
Teste se todos os três protocolos retornam dados consistentes:
- Chame o endpoint REST
- Chame a query GraphQL
- Chame o método gRPC
- Compare as respostas
Apidog ajuda a garantir que sua API multi-protocolo permaneça consistente.
Escolhendo o Protocolo Certo
Use esta árvore de decisão:
Esta é uma API pública?→ Sim: Use REST (compatibilidade máxima) → Não: Continue
Você precisa de streaming em tempo real?→ Sim: Use gRPC ou WebSocket → Não: Continue
Os clientes precisam de busca de dados flexível?→ Sim: Use GraphQL → Não: Continue
O desempenho é crítico (microsserviços)?→ Sim: Use gRPC → Não: Use REST (opção mais simples)
Exemplos do Mundo Real
- Stripe: REST (API pública, simples, armazenável em cache)
- GitHub: REST + GraphQL (REST para público, GraphQL para consultas complexas)
- Google Cloud: gRPC + REST (gRPC para desempenho, REST para compatibilidade)
- Netflix: GraphQL (aplicativos móveis precisam de dados flexíveis)
- Uber: gRPC (comunicação de microsserviços)
Você Pode Usar Múltiplos Protocolos?
Sim! A Modern PetstoreAPI mostra como. Padrões comuns:
- REST para API pública
- GraphQL para aplicativos móveis
- gRPC para microsserviços internos
Cada protocolo atende a diferentes clientes com diferentes necessidades.
Conclusão
REST, GraphQL e gRPC não são concorrentes — são ferramentas para diferentes trabalhos. REST é universal e simples. GraphQL dá controle aos clientes. gRPC é rápido e eficiente.
A Modern PetstoreAPI implementa todos os três, mostrando como a mesma API funciona entre os protocolos. Você pode explorar a documentação REST, o schema GraphQL e os arquivos proto gRPC para ver exemplos prontos para produção.
Use o Apidog para testar todos os três protocolos, comparar implementações e garantir consistência em sua API multi-protocolo.
O melhor protocolo é aquele que resolve seu problema específico. A Modern PetstoreAPI fornece o conhecimento para você escolher sabiamente.
FAQ
Posso usar REST e GraphQL juntos?
Sim. Muitas APIs oferecem ambos. Use REST para operações simples e GraphQL para consultas complexas. O GitHub faz isso.
O gRPC está substituindo o REST?
Não. gRPC é para microsserviços internos. REST continua sendo o padrão para APIs públicas devido à melhor compatibilidade e ferramentas.
Qual protocolo é o mais rápido?
gRPC é o mais rápido devido aos Protocol Buffers e HTTP/2. Mas para a maioria das APIs, a diferença não importa — a latência da rede domina.
Devo migrar de REST para GraphQL?
Apenas se você tiver o problema de over-fetching/under-fetching. Não migre só porque GraphQL está na moda.
Navegadores podem usar gRPC?
Não diretamente. Você precisa de grpc-web, o que adiciona complexidade. Para clientes de navegador, use REST ou GraphQL.
Como a Modern PetstoreAPI mantém os três protocolos sincronizados?
Camada de lógica de negócios compartilhada. REST, GraphQL e gRPC são adaptadores de protocolo leves sobre a mesma API central.
Qual protocolo as startups devem usar?
Comece com REST. É simples, bem compreendido e possui ótimas ferramentas. Adicione GraphQL ou gRPC mais tarde, se precisar.
O Apidog suporta todos os três protocolos?
Sim. O Apidog suporta REST (OpenAPI), GraphQL e gRPC em uma única ferramenta, tornando fácil testar APIs multi-protocolo como a Modern PetstoreAPI.
