Ce projet fournit un ensemble d'outils .NET pour la gestion des abonnements aux événements, aux transformations de base et aux notifications de ces occurrences d'événements ( webhooks ): Dans une portée de conception globale, ce modèle permet des architectures axées sur les événements, déclenchant des processus système lors de la survenue de présences attendues provenant d'autres systèmes.
Bien que ce modèle d'intégration soit largement adopté par les principaux fournisseurs de services (comme SendGrid , Twilio , Github , Slack , etc.), il n'y a pas de protocole ou d'autorité formel qui appliquerait une conformité (comme pour d'autres cas, tels que OpenID, OpenAPI, etc.).
Quoi qu'il en soit, une implémentation typique se compose des éléments suivants:
J'ai essayé d'exprimer les concepts plus en détail dans cette page dans ce référentiel (sans aucune ambition d'être pédagogique).
Les bibliothèques actuellement fournies par le cadre sont les suivantes:
| Bibliothèque | Nuget | Github (prérearin) |
|---|---|---|
| Deveel.webhooks | ||
| Deveel.webhooks.sder | ||
| Deveel.webhooks.service | ||
| Deveel.webhooks.mongodb | ||
| Deveel.webhooks.entityframework | ||
| Deveel.webhooks.damiclinq | ||
| Deveel.webhooks.receiver.aspnetcore |
Les bibliothèques suivantes étendent le cadre avec les récepteurs pour les fournisseurs spécifiques:
| Bibliothèque | Nuget | Github (prérearin) |
|---|---|---|
| Deveel.webhooks.receiver.twilio | ||
| Deveel.webhooks.receiver.sendgrid | ||
| Deveel.webhooks.receiver.facebook |
Vous pouvez obtenir les versions stables de ces bibliothèques à partir du canal officiel de NuGet.
Pour obtenir les dernières versions de pré-libération des packages, vous pouvez restaurer auprès du Deveel Package Manager.
Nous aimerions vous aider à démarrer avec ce cadre et à l'étendre étendant: veuillez vous référer à la section de la documentation , ou au site officiel que nous avons produit pour vous.
La façon la plus simple de commencer est de suivre le guide de démarrage , mais vous pouvez également vous référer à la section des questions fréquemment posées pour obtenir des réponses aux questions les plus courantes.
While working on a .NET Core 3.1/.NET 5 PaaS ( Platform-as-a-Service ) project that functionally required the capability of users of the service being able to create system-to-system subscriptions and notifications of events through HTTP channel (that is typically named webhooks , or HTTP callbacks ), I started my design with the ambition to use existing solutions, to avoid the bad practice of reinventing the wheel , but I ended up frustrated in such ambition:
La documentation du cadre vous fournira plus de détails sur les exigences, les configurations, l'utilisation et l'extensibilité du cadre.
Quoi qu'il en soit, pour vous aider à démarrer avec le framework, veuillez considérer les exemples suivants qui montrent comment créer un simple service de gestion WebHook, qui gèrent les abonnements et les notifications, et un récepteur client.
En tant que fournisseur de service, cette bibliothèque offre des fonctions pour gérer les deux aspects principaux du modèle WebHook:
L'exemple suivant montre comment créer un abonnement WebHook et comment envoyer une notification aux points de terminaison de l'abonné:
using Microsoft . AspNetCore . Builder ;
using Deveel . Webhooks ;
namespace Example {
public class Program {
public static void Main ( string [ ] args ) {
var builder = WebApplication . CreateBuilder ( args ) ;
// ...
builder . Services . AddWebhookSubscriptions < MongoWebhookSubscription > ( subs => {
subs . UseMongoDb ( "mongodb://localhost:27017" )
. UseSubscriptionResolver ( ) ;
} ) ;
builder . Services . AddWebhookNotifier < MyWebhook > ( notifier => {
notifier . UseSender ( sender => {
sender . Configure ( options => {
options . Timeout = TimeSpan . FromSeconds ( 30 ) ;
} ) ;
} ) ;
} ) ;
var app = builder . Build ( ) ;
// ...
// ... and notify the receivers manually ...
app . MapPost ( "/webhooks" , async ( HttpContext context ,
[ FromServices ] IWebhookSender < MyWebhook > sender , [ FromBody ] MyWebhookModel webhook ) => {
var destination = webhook . Destination . ToWebhookDestination ( ) ;
var result = await sender . SendAsync ( destination , webhook , context . HttpContext . RequestAborted ) ;
// ...
return Results . Ok ( ) ;
} ) ;
// ... or notify the webhooks automatically from subscriptions
app . MapPost ( "/webhooks/notify" , async ( HttpContext context ,
[ FromServices ] IWebhookNotifier < MyWebhook > notifier , [ FromBody ] MyEventModel eventModel ) => {
var eventInfo = eventModel . AsEventInfo ( ) ;
var result = await notifier . NotifyAsync ( eventInfo , context . HttpContext . RequestAborted ) ;
// you can log the result of the notification to all receivers ...
return Results . Ok ( ) ;
} ) ;
app . Run ( ) ;
}
}
} Le cadre fournit également un ensemble de récepteurs intégrés qui peuvent être utilisés pour gérer les notifications entrantes des points de terminaison souscrits de votre application.
L'exemple suivant montre comment créer un récepteur pour un webhook qui est soutenu par un message Facebook Messenger:
namespace Example {
public class Program {
public static void Main ( string [ ] args ) {
var builder = WebApplication . CreateBuilder ( args ) ;
// ...
builder . Services . AddFacebookReceiver ( )
. AddHandler < MyFacebookWebhookHandler > ( ) ;
var app = builder . Build ( ) ;
// ...
// ... you can handle all the incoming webhooks at "/webhooks/facebook"
// invoking all the handlers registered in the service collection ...
app . MapFacebookWebhook ( "/webhooks/facebook" ) ;
// ... or you can handle the incoming webhooks manually ...
app . MapFacebookWebhook ( "/webhooks/facebook2" , async ( FacebookWebhook webhook , IService service , CancellationToken ct ) => {
// ...
await service . DoSomethingAsync ( webhook , ct ) ;
} ) ;
app . Run ( ) ;
}
}
} Les contributions aux projets open source, comme Deveel Webhooks , sont généralement motivées par l'intérêt pour l'utilisation du produit et des services, s'ils respectent certaines des attentes que nous avons pour ses fonctions.
Les meilleures façons de contribuer et d'améliorer la qualité de ce projet sont de l'essayer, de déposer des problèmes, de se joindre à des conversations de conception et de faire des refonces.
Veuillez vous référer aux directives contributives pour recevoir plus de détails sur la façon dont vous pouvez contribuer à ce projet.
Nous visons à répondre à la plupart des questions que vous pourriez avoir en fournissant des documentations, en répondant aux questions fréquemment posées et en suivant des problèmes tels que des rapports de bogues et des demandes de fonctionnalités.
Ce projet est publié dans le cadre de l'accord de licence open source d'Apache 2.