Saltar al contenido principal

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 ApiException do 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))));