Webhook vs API: quando buscar e quando receber

Webhook vs API

Webhook vs API: push vs pull, assinaturas, retries | We.Inc

Webhook vs API explicado com uma tabela comparativa, os prós e contras de polling vs push, um verificador de assinatura HMAC no navegador, tratamento de retries e código de receptor idempotente.

Com uma chamada de API, seu código pede dados a outro serviço quando quiser: isso é pull. Com um webhook, o serviço envia um HTTP POST para a sua URL no momento em que algo acontece: isso é push. A maioria das integrações usa os dois, um webhook para saber de uma mudança rapidamente e uma chamada de API para buscar o registro completo e atual.

Requisição de API vs webhook

Fazer polling em uma API a cada minuto para ver se um pagamento foi compensado desperdiça requisições e ainda assim chega atrasado. Um webhook inverte a direção, mas também passa a responsabilidade para você: seu endpoint precisa ser público, provar que cada mensagem é genuína, responder rápido e lidar com o mesmo evento chegando duas vezes. Esta página cobre cada uma dessas tarefas com código que você pode copiar.

Perguntas frequentes

Um webhook é um tipo de API?

De forma geral, sim. É uma requisição HTTP com um corpo JSON, só que enviada na direção oposta. Às vezes chamam de API reversa. A diferença que importa é quem inicia a conversa e quem precisa estar online para recebê-la.

Devo fazer polling ou usar webhooks?

Use webhooks quando o provedor os oferece para os eventos de que você precisa e você consegue hospedar um endpoint HTTPS público. Faça polling quando não houver webhook, quando você estiver atrás de um firewall ou para poucas verificações em que um minuto de atraso não faz diferença.

Como saber se um webhook veio mesmo do provedor?

A maioria dos provedores envia em um header um HMAC SHA-256 do corpo, calculado com um segredo que só você e eles conhecem. O GitHub, por exemplo, usa X-Hub-Signature-256 com o prefixo sha256=; o Stripe usa Stripe-Signature com um timestamp. Recalcule e compare antes de confiar em qualquer coisa.

O que acontece se meu endpoint estiver fora do ar?

A maioria dos provedores tenta reenviar entregas que falharam com intervalos cada vez maiores, por um período que depende do provedor. O Stripe, por exemplo, continua tentando enviar eventos de produção por até três dias. Depois disso, o evento só fica disponível pela API ou pelo painel deles.

Por que um handler de webhook deve responder antes de fazer o trabalho?

Os provedores esperam pouco tempo por uma resposta. Se o seu código envia e-mails ou chama outros serviços antes, a entrega pode estourar o tempo e ser reenviada, mesmo que você já tenha agido. Coloque o job na fila, retorne 200 e processe depois.

Pull: chamando uma API

Push: recebendo um webhook

Usando os dois juntos

Um receptor de webhook que confere a assinatura

Node e Express: HMAC SHA-256 sobre o corpo bruto

express.raw mantém o corpo como bytes para que a assinatura bata. Este formato de header segue a convenção sha256= do GitHub; adapte o nome do header para outros provedores.

Lidando com retries e duplicatas

Um índice único no id do evento faz uma segunda entrega falhar no insert, então o trabalho roda uma vez só, não importa quantas vezes o evento chegue.

Registrar cada id de evento uma vez (PostgreSQL)

ON CONFLICT DO NOTHING não retorna linha para uma duplicata, e seu código trata isso como já processado.

A alternativa com polling

O polling é mais simples de hospedar, mas é mais lento e gera mais tráfego. Mantenha um cursor para que cada consulta peça só o que é novo.

Verificador de assinatura HMAC SHA-256

Cole um corpo e um segredo para calcular a assinatura que um provedor enviaria e depois cole o header que você recebeu para comparar. Tudo roda no seu navegador com a Web Crypto API; nada é enviado para lugar nenhum.

Corpo bruto da requisição

Segredo do webhook

Assinatura que este corpo deve ter

Header de assinatura que você recebeu (opcional)

Confere: o corpo e o segredo produzem esta assinatura.

Não confere: o corpo mudou, o segredo está errado ou o header usa outro formato.

Calculando

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site