Este projeto fornece um conjunto de ferramentas .NET para o gerenciamento de assinaturas para eventos, transformações básicas e notificações de tais ocorrências de eventos ( webhooks ): em um escopo de design global, esse modelo permite arquiteturas orientadas por eventos, desencadeando processos do sistema sobre a ocorrência de ocorrências esperadas de outros sistemas.
Embora esse modelo de integração seja amplamente adotado pelos principais provedores de serviços (como SendGrid , Twilio , Github , Slack etc.), não existe um protocolo ou autoridade formal que aplicaria uma conformidade (como para outros casos, como OpenId, OpenApi etc.).
De qualquer forma, uma implementação típica consiste nos seguintes elementos:
Tentei expressar os conceitos com mais detalhes nesta página neste repositório (sem qualquer ambição de ser pedagógica).
As bibliotecas atualmente fornecidas pela estrutura são as seguintes:
| Biblioteca | NUGET | Github (pré -lançamento) |
|---|---|---|
| Deveel.webhooks | ||
| Deveel.webhooks.sender | ||
| Deveel.webhooks.service | ||
| Deveel.webhooks.mongodb | ||
| Deveel.webhooks.entityframework | ||
| Deveel.webhooks.dynamiclinq | ||
| Deveel.webhooks.receiver.aspnetcore |
As bibliotecas a seguir estendem a estrutura com receptores para fornecedores específicos:
| Biblioteca | NUGET | Github (pré -lançamento) |
|---|---|---|
| Deveel.webhooks.receiver.twilio | ||
| Deveel.webhooks.receiver.sendGrid | ||
| Deveel.webhooks.receiver.facebook |
Você pode obter as versões estáveis dessas bibliotecas do canal oficial do NUGET.
Para obter as mais recentes versões de pré-lançamento dos pacotes, você pode restaurar do Deveel Package Manager.
Gostaríamos de ajudá -lo a começar com essa estrutura e, eventualmente, estendê -la: consulte a seção de documentação ou o site oficial que produzimos para você.
A maneira mais fácil de começar é seguir o guia de início , mas você também pode consultar a seção de perguntas frequentes para obter respostas para as perguntas mais comuns.
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 em tal ambição:
A documentação da estrutura fornecerá mais detalhes sobre os requisitos, configurações, uso e extensibilidade da estrutura.
De qualquer forma, para ajudá -lo a começar a estrutura, considere os seguintes exemplos que mostram como criar um serviço simples de gerenciamento de webhook, que lida com assinaturas e notificações e um receptor cliente.
Como fornecedor de serviço, esta biblioteca fornece funções para lidar com os dois aspectos principais do padrão Webhook:
O exemplo a seguir mostra como criar uma assinatura do Webhook e como enviar uma notificação aos pontos de extremidade do assinante:
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 ( ) ;
}
}
} A estrutura também fornece um conjunto de receptores internos que podem ser usados para lidar com as notificações recebidas dos pontos de extremidade subscritos em seu aplicativo.
O exemplo a seguir mostra como criar um receptor para um webhook que é apoiado por uma mensagem do 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 ( ) ;
}
}
} As contribuições para projetos de código aberto, como a Deveel Webhooks , são geralmente impulsionados pelo interesse em usar o produto e os serviços, se respeitarem algumas das expectativas que temos por suas funções.
As melhores maneiras de contribuir e melhorar a qualidade deste projeto são experimentando, arquivando problemas, juntando-se a conversas de design e fazendo pedidos.
Consulte as diretrizes contribuintes para receber mais detalhes sobre como você pode contribuir para este projeto.
Nosso objetivo é abordar a maioria das perguntas que você pode ter, fornecendo documentações, respondendo a perguntas frequentes e acompanhando questões como relatórios de bugs e solicitações de recursos.
Este projeto é divulgado no contrato de licenciamento de código aberto Apache 2.