📡 Como Comunicar Múltiplas APIs com .NET



This content originally appeared on DEV Community and was authored by Danilo O. Pinheiro, dopme.io

No ecossistema de software moderno, é cada vez mais comum que aplicações precisem se comunicar com múltiplas APIs para compor funcionalidades. Essa integração pode envolver APIs internas (microserviços) ou externas (parceiros, serviços de terceiros).
No .NET, temos um conjunto robusto de ferramentas e práticas para garantir que essa comunicação seja eficiente, resiliente e segura.

Neste artigo, vamos explorar os principais padrões, bibliotecas e estratégias para implementar comunicação entre múltiplas APIs usando .NET moderno.

⚠ 1. Desafios na Comunicação com Múltiplas APIs

Antes de entrar nas soluções, é importante entender os principais desafios que surgem:

  • 🔌 Gerenciamento de conexões: evitar abertura excessiva de conexões HTTP.
  • 🛡 Resiliência e tolerância a falhas: lidar com indisponibilidade temporária.
  • ⏱ Latência e performance: evitar bloqueios e gargalos.
  • 🔐 Segurança: autenticação, autorização e proteção contra ataques.
  • 📏 Padronização: manter consistência no tratamento de erros, logs e métricas.

🏗 2. Estrutura Base com HttpClientFactory

No .NET Core e posteriores, a forma recomendada de fazer chamadas HTTP é utilizando o IHttpClientFactory. Ele resolve problemas como socket exhaustion e facilita a configuração de políticas globais.

builder.Services.AddHttpClient("ServiceA", client =>
{
    client.BaseAddress = new Uri("https://api.servicoa.com");
    client.DefaultRequestHeaders.Add("Accept", "application/json");
});

builder.Services.AddHttpClient("ServiceB", client =>
{
    client.BaseAddress = new Uri("https://api.servicob.com");
});

E o uso:

public class ApiService
{
    private readonly HttpClient _clientA;
    private readonly HttpClient _clientB;

    public ApiService(IHttpClientFactory factory)
    {
        _clientA = factory.CreateClient("ServiceA");
        _clientB = factory.CreateClient("ServiceB");
    }

    public async Task<string> GetFromServiceAAsync()
    {
        var response = await _clientA.GetAsync("/endpoint");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

🔄 3. Padrões de Comunicação

⏳ 3.1 Comunicação Síncrona

Chamadas HTTP diretas, geralmente usando REST ou gRPC. Boa para respostas imediatas, mas exige cuidado com latência.

📬 3.2 Comunicação Assíncrona

Uso de mensageria (RabbitMQ, Kafka, Azure Service Bus) para desacoplar serviços e aumentar resiliência.

🌐 3.3 API Gateway

Centraliza chamadas para múltiplas APIs. Exemplos no .NET: Ocelot, YARP.

🛠 4. Resiliência com Polly

Para evitar falhas em cascata, usamos o Polly, uma biblioteca que implementa políticas de retry, circuit breaker, timeout e fallback.

builder.Services.AddHttpClient("ServiceA", client =>
{
    client.BaseAddress = new Uri("https://api.servicoa.com");
})
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)))
.AddTransientHttpErrorPolicy(p => p.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));

🔐 5. Segurança e Autenticação

Quando lidamos com múltiplas APIs, precisamos padronizar a autenticação:

  • 🔑 OAuth 2.0 / OpenID Connect para APIs externas.
  • 🎫 JWT para APIs internas.
  • 🪪 API Keys quando não há suporte a protocolos mais avançados.

Exemplo de configuração de token JWT no HttpClient:

builder.Services.AddHttpClient("SecureService", client =>
{
    client.BaseAddress = new Uri("https://api.secure.com");
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", "seu-token-aqui");
});

📊 6. Observabilidade

Para monitorar múltiplas integrações, é essencial incluir:

  • 📝 Logging com ILogger<T>.
  • 🛰 Tracing distribuído com OpenTelemetry.
  • 📈 Métricas expostas para Prometheus, Datadog, etc.
builder.Services.AddOpenTelemetryTracing(b =>
{
    b.AddAspNetCoreInstrumentation()
     .AddHttpClientInstrumentation()
     .AddJaegerExporter();
});

🗂 7. Estratégia de Versionamento e Evolução

Ao integrar múltiplas APIs, versionamento é fundamental:

  • 🏷 Versionar endpoints (ex.: /v1/orders).
  • 🧩 Criar camadas de abstração para evitar acoplamento direto.
  • 📦 Usar DTOs para controlar contratos de entrada e saída.

📚 Conclusão

A comunicação entre múltiplas APIs com .NET exige mais do que apenas chamadas HTTP. É necessário pensar em resiliência, segurança, observabilidade e padronização. Ferramentas como HttpClientFactory, Polly, API Gateways e protocolos modernos como gRPC ajudam a criar integrações robustas e escaláveis.

Ao seguir boas práticas e padrões arquiteturais, conseguimos reduzir o risco de falhas, aumentar a manutenibilidade e preparar o sistema para crescer de forma sustentável.

🤝 Conecte-se Comigo

Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:

💼 LinkedIn
✍ Medium
📬 contato@dopme.io

“Visto como levastes a minha prata e o meu ouro, e as minhas coisas desejáveis e formosas pusestes nos vossos templos.”
Joel 3:5


This content originally appeared on DEV Community and was authored by Danilo O. Pinheiro, dopme.io