פֶּה אֶל פֶּה אֲדַבֶּר בּוֹ peh el peh adaber bo · boca a boca eu falo com ele · Bamidbar 12:8

Blog/Artigos · Engenharia

Design de API: boca a boca, o contrato claro entre quem serve e quem consome

A API como contrato, REST e o modelo de maturidade, GraphQL e gRPC, e o versionamento que não quebra quem depende de você.

Por Juliano Vince de Campos · · 9 min de leitura · 5 seções · 5 figuras

פֶּה אֶל פֶּה PEH · BAMIDBAR 12:8

A Torá distingue como Deus falava com Moshe do modo como falava com outros profetas: com Moshe era boca a boca, claramente, e não por enigmas. A diferença é entre a comunicação direta e sem ambiguidade e a mensagem cifrada que exige adivinhação. Uma API é uma forma de comunicação entre sistemas, e ela pode ser das duas maneiras. A API mal desenhada fala por enigmas: nomes obscuros, comportamento surpreendente, documentação que não bate com a realidade, e quem consome passa o dia adivinhando o que ela quis dizer. A API bem desenhada fala boca a boca: o contrato é claro, o comportamento é previsível, e quem integra entende sem adivinhar. Desenhar API é, antes de tudo, o compromisso de falar claramente com quem vai depender de você.

A API é um contrato, e o contrato tem quem confia nele

O que torna o design de API diferente do design interno é a plateia: uma API tem consumidores que você não controla e que passam a depender dela. Cada campo que você expõe, cada comportamento, cada código de erro, vira uma promessa da qual alguém vai depender, e quebrar essa promessa quebra a integração de quem confiou. Isso muda tudo. Internamente, você refatora à vontade; na API pública, cada mudança carrega o peso de possivelmente quebrar consumidores que você nem sabe que existem. A API é um contrato, e contrato bom é claro na assinatura e estável no cumprimento.

Por isso o bom design de API começa pela perspectiva de quem consome, não de quem implementa. A pergunta certa não é como exponho minha estrutura interna, é o que faz sentido para quem vai usar isto. Nomes que refletem o domínio e não a tabela interna; comportamento previsível que segue o princípio do menor espanto; erros que explicam o que deu errado e o que fazer; consistência para que, aprendida uma parte, o resto seja adivinhável no bom sentido. Falar boca a boca com quem consome é desenhar a API para ser entendida sem que o consumidor precise ler o seu código-fonte para descobrir o que ela realmente faz.

Figura 1API que fala por enigmas e API que fala boca a boca
AspectoAPI por enigmasAPI boca a boca
Nomesrefletem a tabela interna, obscurosrefletem o domínio, óbvios para quem usa
Erroscódigo genérico, sem explicaçãodizem o que deu errado e o que fazer
Comportamentosurpreende, casos especiais escondidosprevisível, segue o menor espanto
Documentaçãodesatualizada, não bate com a realcontrato explícito, gerado da fonte da verdade
Estabilidademuda e quebra quem dependeevolui sem quebrar o contrato prometido
Cada campo exposto é uma promessa da qual alguém depende. O bom design começa pela perspectiva de quem consome, não de quem implementa: a API é desenhada para ser entendida sem ler o código-fonte.

REST: recursos, verbos e a maturidade real

REST, o estilo que Roy Fielding descreveu, organiza a API em torno de recursos, substantivos do domínio, endereçados por URL, e manipulados pelos verbos do HTTP: GET para ler, POST para criar, PUT e PATCH para atualizar, DELETE para remover. Bem feito, é intuitivo: quem conhece HTTP adivinha metade da API. O modelo de maturidade de Richardson descreve os degraus de fazer REST de verdade, do nível zero, que só usa HTTP como túnel para chamadas, até usar recursos, usar os verbos com sua semântica correta, e por fim os hyperlinks que guiam o cliente pelo que é possível fazer a seguir.

A maioria das APIs REST do mercado vive nos degraus intermediários, e tudo bem, o pragmatismo vence a pureza. O que importa é usar a semântica do HTTP a favor da clareza, não contra: um GET não deve ter efeito colateral, um DELETE deve ser idempotente, os códigos de status devem significar o que significam, 404 para não encontrado, 400 para pedido malformado, 409 para conflito, e não um 200 com uma mensagem de erro escondida no corpo. Essa coerência é o que faz a API falar boca a boca com toda a infraestrutura de rede, caches, proxies e clientes, que já entendem HTTP. REST bem feito não inventa uma linguagem; usa bem a que já existe e todo mundo fala.

Figura 2O modelo de maturidade de Richardson para REST
  1. 0Túnel HTTPusa HTTP só como transporte, um endpoint para tudo
  2. 1Recursosorganiza em torno de substantivos endereçados por URL
  3. 2Verbos HTTPGET, POST, PUT, DELETE com sua semântica correta
  4. 3Hipermídialinks guiam o cliente pelo que é possível fazer a seguir
A maioria das APIs vive nos degraus intermediários, e tudo bem: o pragmatismo vence a pureza. O que importa é usar a semântica do HTTP a favor da clareza, e não um 200 com erro escondido no corpo.

GraphQL e gRPC: quando REST não é a melhor conversa

REST é o padrão, mas não é a única boa conversa. O GraphQL, criado no Facebook, inverte quem decide o formato da resposta: em vez de o servidor definir endpoints fixos, o cliente pede exatamente os campos de que precisa, numa única consulta que pode atravessar várias entidades. Isso resolve dois problemas clássicos de REST, o over-fetching, receber mais dados do que precisa, e o under-fetching, ter que fazer várias chamadas para montar uma tela. É poderoso para frontends ricos com necessidades variadas, e por isso casa bem com microfrontends e apps móveis, ao custo de mais complexidade no servidor e desafios próprios de cache e de limitar consultas caras.

O gRPC, do Google, resolve outra necessidade: comunicação de alto desempenho entre serviços. Ele é contract-first por natureza, o contrato é definido primeiro num arquivo de esquema, e usa um formato binário compacto sobre HTTP/2, muito mais eficiente que JSON para tráfego intenso serviço a serviço. É ideal para a comunicação interna de um sistema de microsserviços, onde a performance importa e ambos os lados são seus, e menos adequado para APIs públicas voltadas ao navegador. A escolha entre os três não é de moda, é de adequação: REST para APIs de recurso claras e públicas, GraphQL para clientes com necessidades variadas de leitura, gRPC para comunicação interna de alta performance. Muitas arquiteturas usam os três, cada um onde fala melhor.

Figura 3REST, GraphQL e gRPC: cada um onde fala melhor
EstiloQuem decide o formatoOnde brilhaO custo
RESTo servidor, em endpointsAPIs de recurso claras e públicasover e under-fetching
GraphQLo cliente, pedindo camposfrontends ricos, apps, microfrontendscomplexidade de servidor, cache, consultas caras
gRPCcontrato binário, definido antescomunicação interna de alta performancemenos amigável ao navegador
A escolha é de adequação, não de moda. REST para recurso público, GraphQL para clientes com necessidades variadas de leitura, gRPC para comunicação interna de alta performance. Muitas arquiteturas usam os três, cada um onde fala melhor.

Contract-first e versionamento: não quebrar quem confiou

Falar boca a boca exige que o contrato exista antes e explicitamente, e é isso que o design contract-first propõe: definir o contrato da API, com OpenAPI para REST, esquema para GraphQL, protobuf para gRPC, antes de implementar, e gerar a partir dele a documentação, os stubs de cliente e servidor, e os testes de contrato. O ganho é que o contrato vira a fonte única da verdade, negociada entre quem serve e quem consome antes de uma linha de código, e a documentação nunca mais fica desatualizada, porque ela é gerada do contrato, não escrita à parte e esquecida.

E há o problema que separa a API amadora da profissional: a evolução. Uma API viva precisa mudar, mas mudar sem quebrar quem depende dela. A regra de ouro é a compatibilidade retroativa: adicionar campos e endpoints é seguro, porque quem não os usa não é afetado; remover ou mudar o significado de algo é uma mudança que quebra, e essas exigem versionamento explícito e um período em que a versão antiga convive com a nova, dando tempo aos consumidores de migrar. Quebrar o contrato sem aviso é o pior pecado de uma API, porque a confiança que o consumidor depositou nela é justamente o que a torna útil, e uma API em que não se pode confiar para não quebrar é uma API que ninguém quer integrar. Falar boca a boca inclui não mudar de língua sem avisar quem aprendeu a sua.

Figura 4Mudanças na API: quebram o contrato ou não
Impacto em quem já consome
Adição seguranovo campo ou endpoint: quem não usa não é afetado. Livre.
Mudança compatívelnovo comportamento opcional, padrão preservado: seguro com cuidado.
Remoção ou troca de sentidoquebra quem depende: exige nova versão e período de convivência.
Quebra sem avisomuda o contrato e derruba consumidores: o pior pecado de uma API.
Tipo de mudança
A regra de ouro é a compatibilidade retroativa: adicionar é seguro, remover ou mudar sentido quebra e exige versão nova com convivência. Contract-first faz o contrato ser a fonte da verdade, e a doc nunca desatualiza.

A maturidade da API, e onde ela se conecta

O design de API amadurece do enigma ao contrato tratado como produto. No começo a API é um reflexo da estrutura interna, fala por enigmas, muda sem aviso. Depois vem o uso coerente da semântica, REST bem feito. No meio vem o contract-first, com o contrato como fonte da verdade e documentação gerada. No topo é a API tratada como produto: desenhada para o consumidor, versionada com compatibilidade retroativa, com o estilo certo, REST, GraphQL ou gRPC, para cada necessidade, e a evolução governada para nunca quebrar quem confiou. Cada degrau troca a conveniência de quem implementa pela clareza de quem consome.

A API é a costura de tudo o que este eixo construiu. É por ela que os microsserviços conversam, e um contrato ruim recria o acoplamento que a divisão queria evitar; é o contrato que a arquitetura de eventos publica; é a fronteira do contexto delimitado do DDD exposta ao mundo; e é a porta do hexágono da Clean Architecture voltada para fora. Falar boca a boca, claramente e não por enigmas, é o compromisso que torna todas essas peças integráveis, porque de nada adianta um sistema bem arquitetado por dentro se ele fala por enigmas com quem precisa consumi-lo. A clareza do contrato é a cortesia que a engenharia deve a quem depende dela, e é ela que faz um sistema ser não só correto, mas usável por outros.

Figura 5Maturidade no design de API
  1. 0Reflexo internoa API espelha a estrutura interna, fala por enigmas
  2. 1Semântica coerenteREST que usa bem os verbos e códigos do HTTP
  3. 2Contract-firstcontrato como fonte da verdade, doc gerada dele
  4. 3Estilo por necessidadeREST, GraphQL ou gRPC, cada um onde fala melhor
  5. 4Evolução governadacompatibilidade retroativa, versão só quando quebra
  6. 5API como produtodesenhada para o consumidor, contrato em que se confia
Cada degrau troca a conveniência de quem implementa pela clareza de quem consome. A API é a costura do eixo: por ela os serviços conversam, e um contrato ruim recria o acoplamento que a divisão queria evitar.

Para levar

Design de API é o compromisso de falar boca a boca, claramente e não por enigmas, com quem vai depender de você. A API é um contrato, e cada campo exposto é uma promessa: desenhe pela ótica do consumidor, use a semântica do HTTP a favor da clareza, e escolha REST, GraphQL ou gRPC por adequação, não por moda. A regra de ouro da evolução é a compatibilidade retroativa, para nunca quebrar quem confiou. A IA é o consumidor exigente e o guardião do contrato. Mas a cortesia de falar claramente com quem depende de você continua sendo uma escolha de quem entende que sistema correto por dentro precisa ser usável por fora.

Tags

  • #julianovincedecampos
  • #API
  • #REST
  • #Engenharia
  • #GraphQL
  • #Contrato
  • #Integração
Retrato de Juliano Vince de Campos

Quem escreve: Juliano Vince de Campos

Gerente de Operações, Tecnologia e Infraestrutura (SRE) numa central de registros. Trabalho com tecnologia desde 2009 e com cibersegurança em tempo integral desde 2015, em infraestrutura crítica, fintech e banking. Escrevo sobre o que eu opero: confiabilidade, segurança, governança e IA que passa por gate antes de chegar em produção.

Leia em seguida

Onde eu estudei, me certifiquei e trabalhei

  • University of Cambridge
  • PUC Minas
  • PUC-RS
  • PUC Goiás
  • Pontificia Universidad Católica del Perú
  • Amazon Web Services
  • Google
  • IBM
  • Oracle
  • COBIT 5 Foundation
  • ITIL v3 Foundation
  • Exemplar Global
  • Red Team Leaders
  • Infosec
  • Salesforce
  • Flowgrammers
  • ISO/IEC 27001
  • NIST Cybersecurity Framework
  • Compass UOL
  • Luby
  • Creditas
  • PicPay
  • PagoNxt, Santander
  • Mercado Pago
  • Itaú Unibanco
  • Foursys
  • Soluti Certificação Digital