WebhookConnector
Introdução
O WebhookConnector é uma composição que combina duas APIs distintas para fornecer acesso completo ao sistema de webhooks. Este connector é construído usando Refit para chamadas HTTP tipadas e oferece uma interface unificada para interagir com:
- IWebhookPartitionsApi: Gerenciamento de partições e mensagens
- IWebhookMessagesApi: Criação e publicação de eventos
Diferente de implementações tradicionais, o WebhookConnector expõe diretamente as interfaces Refit públicas, permitindo acesso granular a cada API individualmente quando necessário, mantendo também a conveniência de uma interface unificada.
Características Principais
- ✅ Interfaces Refit Públicas: Acesso direto às APIs individuais
- ✅ Autenticação API Key: Configuração automática via header
X-API-Key - ✅ Serialização JSON: Configuração automática com System.Text.Json
- ✅ Dependency Injection: Integração completa com DI do .NET
- ✅ Tratamento de Erros: Suporte a
ApiExceptiondo Refit - ✅ Configuração Flexível: Via código ou
appsettings.json
var x = 10;
Instalação
# Instalar os pacotes necessários
dotnet add package Refit
dotnet add package Refit.HttpClientFactory
dotnet add package Microsoft.Extensions.Http
Configuração Básica
Via Dependency Injection
// Program.cs
services.AddWebhookApiClient(config =>
{
config.BaseUrl = "https://api.webhook.com";
config.ApiKey = "sua-api-key-aqui";
config.Timeout = TimeSpan.FromMinutes(2);
});
Via appsettings.json
{
"WebhookApi": {
"BaseUrl": "https://api.webhook.com",
"ApiKey": "sua-api-key-aqui"
}
}
services.AddWebhookApiClient(config =>
{
config.BaseUrl = configuration["WebhookApi:BaseUrl"];
config.ApiKey = configuration["WebhookApi:ApiKey"];
});
Uso das Interfaces
1. Interface Unificada (Recomendado)
public class MeuServico
{
private readonly IWebhookApiClient _webhookClient;
public MeuServico(IWebhookApiClient webhookClient)
{
_webhookClient = webhookClient;
}
public async Task ExemploUso()
{
// Acesso a todos os métodos através da interface unificada
var partitions = await _webhookClient.GetPartitionsAsync();
await _webhookClient.CreateMessageAsync(new PublishEventDto
{
EventType = "UserCreated",
Data = new { UserId = 123 }
});
}
}
2. Interfaces Individuais (Para casos específicos)
public class ServicosEspecializados
{
private readonly IWebhookPartitionsApi _partitionsApi;
private readonly IWebhookMessagesApi _messagesApi;
public ServicosEspecializados(
IWebhookPartitionsApi partitionsApi,
IWebhookMessagesApi messagesApi)
{
_partitionsApi = partitionsApi;
_messagesApi = messagesApi;
}
public async Task TrabalharApenasComParticoes()
{
// Trabalhar apenas com partições
var partitions = await _partitionsApi.GetPartitionsAsync();
var messages = await _partitionsApi.GetMessagesAsync(1);
}
public async Task TrabalharApenasComMensagens()
{
// Trabalhar apenas com criação de mensagens
await _messagesApi.CreateMessageAsync(new PublishEventDto
{
EventType = "OrderProcessed",
Data = new { OrderId = 456 }
});
}
}
Tratamento de Erros
try
{
var partitions = await _webhookClient.GetPartitionsAsync();
}
catch (ApiException ex)
{
// Erro HTTP da API
Console.WriteLine($"API Error: {ex.StatusCode} - {ex.Content}");
}
catch (HttpRequestException ex)
{
// Erro de rede/conectividade
Console.WriteLine($"Network Error: {ex.Message}");
}
catch (TaskCanceledException ex)
{
// Timeout
Console.WriteLine($"Request Timeout: {ex.Message}");
}
Configuração Avançada
Custom HttpClient
services.AddWebhookApiClient(config =>
{
config.BaseUrl = "https://api.webhook.com";
config.ApiKey = "sua-api-key";
})
.ConfigureHttpClient(client =>
{
// Configurações adicionais do HttpClient
client.DefaultRequestHeaders.Add("User-Agent", "MeuApp/1.0");
});
Políticas de Retry com Polly
services.AddWebhookApiClient(config => { /* ... */ })
.AddPolicyHandler(Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));