Implémentation du serveur
Voici des exemples d'implémentations de serveur de points de terminaison de webhook dans différents langages de programmation.
info
Nous vous fournirons volontiers des exemples de code dans d'autres langages/frameworks si vous en avez besoin.
Exemple Node.js
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
const event = req.body;
console.log('Received webhook event:', JSON.stringify(event, null, 2));
// Validate the event
if (!event.organizationCode || !event.type || !event.operation || !event.doc) {
return res.status(400).send('Invalid event payload');
}
// Process based on operation type
switch(event.operation) {
case 'create':
handleDocumentCreated(event.doc);
break;
case 'update':
handleDocumentUpdated(event.doc);
break;
case 'delete':
handleDocumentDeleted(event.doc);
break;
default:
console.log('Unknown operation:', event.operation);
}
// Return a 200 OK to acknowledge receipt
res.status(200).send('Event received');
});
function handleDocumentCreated(doc) {
console.log(`Document created: ${doc.id} - ${doc.name}`);
// Your business logic here
}
function handleDocumentUpdated(doc) {
console.log(`Document updated: ${doc.id} - ${doc.name}`);
// Your business logic here
}
function handleDocumentDeleted(doc) {
console.log(`Document deleted: ${doc.id} - ${doc.name}`);
// Your business logic here
}
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Webhook server listening on port ${PORT}`);
});
Exemple Python
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
event = request.json
print(f"Received webhook event: {event}")
# Validate the event
if not all(k in event for k in ['organizationCode', 'type', 'operation', 'doc']):
return jsonify({'error': 'Invalid event payload'}), 400
# Process based on operation type
if event['operation'] == 'create':
handle_document_created(event['doc'])
elif event['operation'] == 'update':
handle_document_updated(event['doc'])
elif event['operation'] == 'delete':
handle_document_deleted(event['doc'])
else:
print(f"Unknown operation: {event['operation']}")
# Return a 200 OK to acknowledge receipt
return jsonify({'status': 'success'}), 200
def handle_document_created(doc):
print(f"Document created: {doc['id']} - {doc['name']}")
# Your business logic here
def handle_document_updated(doc):
print(f"Document updated: {doc['id']} - {doc['name']}")
# Your business logic here
def handle_document_deleted(doc):
print(f"Document deleted: {doc['id']} - {doc['name']}")
# Your business logic here
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3000)
Bonnes pratiques
- Répondez toujours rapidement : Les webhooks attendent une réponse rapide (en quelques secondes). Pour les traitements de longue durée, accusez réception du webhook immédiatement et traitez l'événement de manière asynchrone.
- Implémentez une logique de réessai : Stonal peut réessayer les livraisons de webhook ayant échoué. Implémentez l'idempotence dans vos gestionnaires pour éviter les traitements en double.
- Sécurisez votre point de terminaison : Envisagez d'utiliser HTTPS.
- Mettez en place une surveillance : Surveillez la disponibilité et les temps de réponse de votre point de terminaison de webhook.
- Gérez les erreurs avec élégance : Journalisez les erreurs pour le débogage, mais assurez-vous que votre point de terminaison de webhook renvoie toujours une réponse
200 OKlorsque vous avez bien reçu l'événement, même si votre traitement comporte des erreurs.