ROTA · 6 CLASSES · 1 GRUPOS
Webhooks na Prática
Receba eventos, valide assinaturas e garanta processamento idempotente.
Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes fundamentais e o bônus Go 1.27 são grátis com conta.O ARCO DA ROTA
ORDEM RECOMENDADA
6 classes, do primeiro passo ao fechamento.
Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.
- 01Webhooks na PráticaReceba POSTs sem perder o controle do corpo
Receba webhooks por HTTP, limite o corpo e responda com status previsíveis antes de executar regras de negócio.
- 02Webhooks na PráticaVerifique HMAC antes de confiar no payload
Autentique webhooks com HMAC SHA-256, decodificação segura e comparação em tempo constante.
- 03Webhooks na PráticaTorne entregas repetidas inofensivas
Impeça efeitos duplicados com chaves de evento, claim atômico e respostas corretas para retries.
- 04Webhooks na PráticaProcesse webhooks reais do GitHub
Valide e interprete um webhook de pull request do GitHub usando fixtures locais e headers reais.
- 05Webhooks na PráticaValide eventos Stripe com tolerância temporal
Verifique assinaturas Stripe, tolerância de timestamp e eventos financeiros gravados sem acessar a rede.
- 06Webhooks na PráticaMonte um receiver completo para dois provedores
Monte um receiver demonstrável com roteamento, HMAC, idempotência e despacho para GitHub e Stripe.
PRÉVIA DA PRIMEIRA CLASSE
Receba POSTs sem perder o controle do corpo
const maxBodyBytes int64 = 1024
if r.Method != http.MethodPost { // Recuse antes de ler o corpo.
http.Error(w, "método inválido", http.StatusMethodNotAllowed)
return
}
body, err := io.ReadAll(io.LimitReader(r.Body, maxBodyBytes+1))
if err != nil || int64(len(body)) > maxBodyBytes { // Detecte o byte excedente.
http.Error(w, "corpo inválido", http.StatusRequestEntityTooLarge)
return
}
w.WriteHeader(http.StatusAccepted) // Confirme só depois das guardas.
Pense na doca de um depósito. O caminhão não entra direto na área de estoque: primeiro a portaria confirma a doca, confere o manifesto e pesa a carga. Um endpoint de webhook é essa portaria. Ele recebe uma requisição criada por outro sistema, não por uma tela sob seu controle. Por isso, método, tamanho, headers e resposta fazem parte da segurança e da operação, não são acabamento.
Se você chamar io.ReadAll sem limite, um cliente pode consumir memória proporcional ao corpo. Se decodificar JSON antes de preservar os bytes, a assinatura da próxima aula poderá ser calculada sobre uma representação diferente. Se devolver 500 depois de aceitar o evento, o provedor tentará novamente e poderá repetir um efeito. A entrada precisa ter um funil explícito.
O handler aceita somente POST, envolve r.Body com http.MaxBytesReader ou io.LimitReader, lê uma única vez e guarda []byte. Depois valida os metadados mínimos. Nesta aula o processamento termina em uma confirmação; nas próximas, os mesmos bytes passam por autenticação e idempotência. Um 202 Accepted comunica que a entrega foi recebida para processamento, enquanto 204 No Content serve quando o trabalho já terminou sem resposta.
Esse fluxo também define responsabilidade operacional. O provedor considera qualquer resposta fora da faixa de sucesso como motivo potencial para nova tentativa. Portanto, o status HTTP não é um detalhe cosmético: ele controla a fila do outro lado. Responda rapidamente, registre um identificador correlacionável e mova trabalho demorado para uma etapa que você consegue observar. Nunca registre segredo, assinatura completa ou payload sensível apenas para facilitar debug.
A fronteira deve permanecer determinística nos testes. httptest, readers em memória, relógio injetado e fixtures gravadas reproduzem os casos sem abrir porta, esperar timer ou depender de serviço externo. Isso torna falhas repetíveis e permite demonstrar o receiver em uma revisão de código ou entrevista técnica.
Há ainda um contrato de manutenção: cada etapa deve produzir evidência suficiente para diagnosticar uma recusa sem reproduzir dados confidenciais. Conte status por provedor, classifique falhas de formato, assinatura e duplicidade e preserve um ID de correlação. Uma métrica agregada responde se o problema começou após deploy ou rotação de segredo; o ID permite localizar uma entrega específica. O corpo completo raramente precisa aparecer no log. Essa escolha reduz exposição e mantém a investigação útil.
Entre para continuar nos slides, rodar o código e enfrentar os desafios.
Começar pela rota →ESTA ROTA E TODAS AS OUTRAS
Qualquer plano abre os 192 nós.
Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.