Webhook vs API uitgelegd met een vergelijkingstabel, de afwegingen tussen polling en push, een HMAC-handtekeningcontrole in de browser, retries en idempotente ontvangercode.
Bij een API-aanroep vraagt uw code een andere dienst om data wanneer het uitkomt: dat is pull. Bij een webhook stuurt de dienst een HTTP POST naar uw URL op het moment dat er iets gebeurt: dat is push. De meeste integraties gebruiken beide, een webhook om snel van een wijziging te horen en een API-aanroep om het volledige, actuele record op te halen.
API-verzoek vs webhook
Elke minuut een API pollen om te zien of een betaling is verwerkt, verspilt verzoeken en is toch te laat. Een webhook draait de richting om, maar legt ook verantwoordelijkheid bij u: uw endpoint moet openbaar zijn, van elk bericht bewijzen dat het echt is, snel antwoorden en ermee omgaan dat hetzelfde event twee keer binnenkomt. Deze pagina behandelt elk van die taken met code die u kunt kopiëren.
In grote lijnen wel. Het is een HTTP-verzoek met een JSON-body, alleen in de omgekeerde richting verstuurd. Mensen noemen het soms een omgekeerde API. Het verschil dat telt, is wie het gesprek begint en wie online moet zijn om het te ontvangen.
Gebruik webhooks als de provider ze aanbiedt voor de events die u nodig hebt en u een openbaar HTTPS-endpoint kunt hosten. Poll als er geen webhook is, als u achter een firewall zit, of voor een klein aantal controles waarbij een minuut vertraging geen probleem is.
De meeste providers sturen een HMAC SHA-256 van de body in een header, berekend met een geheim dat alleen u en zij kennen. GitHub gebruikt bijvoorbeeld X-Hub-Signature-256 met een sha256=-voorvoegsel; Stripe gebruikt Stripe-Signature met een tijdstempel. Bereken hem opnieuw en vergelijk voordat u iets vertrouwt.
De meeste providers proberen mislukte leveringen opnieuw met steeds grotere tussenpozen, gedurende een periode die per provider verschilt. Stripe blijft live events bijvoorbeeld tot drie dagen opnieuw proberen. Daarna is het event alleen nog beschikbaar via hun API of dashboard.
Providers wachten maar kort op een antwoord. Als uw code eerst e-mails verstuurt of andere diensten aanroept, kan de levering een time-out krijgen en opnieuw worden geprobeerd, terwijl u er al op had gereageerd. Zet de taak in een wachtrij, geef 200 terug en verwerk daarna.
express.raw houdt de body als bytes zodat de handtekening klopt. Dit headerformaat volgt de sha256=-conventie van GitHub; pas de headernaam aan voor andere providers.
Een unieke index op het event-id laat de insert bij een tweede levering mislukken, zodat het werk één keer draait, hoe vaak het event ook binnenkomt.
ON CONFLICT DO NOTHING geeft geen rij terug bij een duplicaat, wat uw code behandelt als al afgehandeld.
Pollen is eenvoudiger te hosten, maar trager en spraakzamer. Houd een cursor bij zodat elke poll alleen vraagt om wat nieuw is.
Plak een body en een geheim om de handtekening te berekenen die een provider zou sturen, en plak daarna de ontvangen header om te vergelijken. Alles draait in uw browser met de Web Crypto API; er wordt niets verstuurd.
Ruwe request-body
Webhook-geheim
Handtekening die deze body zou moeten hebben
Ontvangen handtekeningheader (optioneel)
Komt overeen: deze body en dit geheim geven deze handtekening.
Komt niet overeen: de body is veranderd, het geheim klopt niet, of de header gebruikt een ander formaat.
Bezig met berekenen
Gratis beginnen · Geen creditcard nodig