Integração com APIs e novidades do C# 13 em 90 min

Imagine que você precisa criar uma aplicação que busque dados de um serviço de clima, consulte um serviço de pagamentos ou se comunique com múltiplos serviços distribuídos. Em cenários como esses, a integração com APIs e serviços externos se torna fundamental. Neste tutorial, vamos explorar como o C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. aprimora esse processo, tornando mais simples e expressivo chamar APIs REST, manipular diferentes formatos de dados e tratar erros e exceções de forma eficiente.

Visão Geral da Integração com APIs🔗

Antes de mergulharmos no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. em si, vale destacar os passos essenciais para consumir dados de uma API ou serviço externo:

1. Enviar solicitações HTTP (GET, POST, PUT, DELETE etc.) utilizando classesBoas práticas de performance e memória para jogos em C# 13Boas práticas de performance e memória para jogos em C# 13Descubra técnicas para otimizar desempenho e uso de memória em jogos com C# 13, utilizando structs, pooling e melhores práticas do GC. como HttpClient.

2. Manipular o formato de resposta (JSON, XML, texto puro etc.) com classesBoas práticas de performance e memória para jogos em C# 13Boas práticas de performance e memória para jogos em C# 13Descubra técnicas para otimizar desempenho e uso de memória em jogos com C# 13, utilizando structs, pooling e melhores práticas do GC. de serialização/deserialização.

3. Tratar erros e garantir que as respostas sejam válidas para o fluxo da aplicação.

4. Garantir segurança e eficiência, incluindo uso de tokens de autenticação, timeouts e reuso de recursos.

O C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. não revoluciona completamente esses passos, mas oferece melhorias textuais e estruturais que facilitam a manutenção, a legibilidade e o desempenho do seu código.

Configurando o Projeto🔗

Para trabalharmos com integrações, normalmente começamos adicionando no arquivo de projeto (.csproj) as dependências necessárias, como por exemplo o pacote SystemIntrodução aos principais namespaces e bibliotecas padrãoIntrodução aos principais namespaces e bibliotecas padrãoExplore um tutorial prático sobre C# 13, descobrindo os namespaces e bibliotecas da BCL. Melhore a performance e legibilidade do seu código..Net.Http.Json, caso precisemos de recursos específicos de serialização/deserialização JSON. No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., podemos destacar o uso de global usingsUso aprimorado de 'global using' e importações simplificadas no C# 13Uso aprimorado de 'global using' e importações simplificadas no C# 13Explore as inovações do C# 13: aprenda a utilizar global using para reduzir repetições e modernizar seu projeto com eficiência e clareza. para tornar o código mais enxuto:

// Arquivo: GlobalUsings.cs
global using System.Net.Http;
global using System.Threading.Tasks;
global using System.Net.Http.Json;

Com isso, não será necessário importar essas bibliotecas em cada arquivo .cs que utilize esses recursos, facilitando o desenvolvimento e a organização do códigoBoas práticas de organização do código em C# 13Boas práticas de organização do código em C# 13Domine as melhores práticas de organização em C# 13. Aprimore a legibilidade e o desempenho do seu código com dicas práticas e exemplos reais..

Consumindo uma API Externa com HttpClient🔗

A classe HttpClient continua sendo a principal forma de interagir com serviços REST no .NET. No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., podemos tirar proveito de melhorias na forma de estruturar o código assíncrono, de modo a torná-lo mais limpo e intuitivo. A seguir, temos um exemplo simples que consome um serviço fictício de clima:

public class ClimaService
{
    private readonly HttpClient _httpClient;
    public ClimaService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
    public async Task<ResultadoClima> ObterClimaAsync(string cidade)
    {
        // Exemplo de endpoint fictício
        var url = $"https://api.exemplo.com/clima?cidade={cidade}";
        try
        {
            var resultado = await _httpClient.GetFromJsonAsync<ResultadoClima>(url);
            return resultado
                ?? throw new Exception("A resposta da API de clima veio nula.");
        }
        catch (HttpRequestException ex)
        {
            // Exemplo de tratamento de erro mais granular
            throw new Exception($"Falha ao se comunicar com o serviço de clima: {ex.Message}", ex);
        }
    }
}
public record ResultadoClima(string Cidade, double Temperatura, string Condicao);

Observe alguns pontos de destaque:

Autenticação e Headers Personalizados🔗

Em muitos cenários, as APIs requerem autenticação ou cabeçalhos especiais para funcionar corretamente. No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., continuamos usando a classe HttpRequestMessage quando precisamos controlar detalhes mais específicos da requisição, mantendo a sintaxe conhecida e adicionando novos recursos de null-checkingRecursos avançados de null-checking no C# 13Recursos avançados de null-checking no C# 13Aprenda a dominar o null-checking em C# 13 com técnicas avançadas e exemplos práticos que garantem código seguro, legível e performático. para evitar surpresas em tempo de execução.

public async Task<ResultadoPagamento> EfetuarPagamentoAsync(PagamentoRequisicao requisicao)
{
    var url = "https://api.financeiro.com/pagamentos";
    // Cria a mensagem com o corpo JSON
    using var mensagem = new HttpRequestMessage(HttpMethod.Post, url)
    {
        Content = JsonContent.Create(requisicao)
    };
    // Adicionando cabeçalho de autenticação (Bearer Token, por exemplo)
    mensagem.Headers.Authorization
        = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "seu-token-aqui");
    // Enviando requisição
    using var resposta = await _httpClient.SendAsync(mensagem);
    resposta.EnsureSuccessStatusCode();
    // Deserializando a resposta
    return (await resposta.Content.ReadFromJsonAsync<ResultadoPagamento>())
           ?? throw new Exception("Erro ao processar resposta de pagamento.");
}

Por que usar using var?

A sintaxe using var garante que o objeto seja descartado após o uso. No caso de HttpRequestMessage e HttpResponseMessage, isso ajuda a liberar recursos de rede e memória.

Manipulando Diferentes Formatos de Dados🔗

Além de JSON, podemos precisar intercambiar dados em XML, CSV ou até mesmo Binary. O C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. não muda radicalmente a forma de lidar com essas tecnologias, mas as atualizações em namespacesIntrodução aos principais namespaces e bibliotecas padrãoIntrodução aos principais namespaces e bibliotecas padrãoExplore um tutorial prático sobre C# 13, descobrindo os namespaces e bibliotecas da BCL. Melhore a performance e legibilidade do seu código. e global usingUso aprimorado de 'global using' e importações simplificadas no C# 13Uso aprimorado de 'global using' e importações simplificadas no C# 13Explore as inovações do C# 13: aprenda a utilizar global using para reduzir repetições e modernizar seu projeto com eficiência e clareza. podem facilitar a importação de bibliotecas de terceiros como SystemIntrodução aos principais namespaces e bibliotecas padrãoIntrodução aos principais namespaces e bibliotecas padrãoExplore um tutorial prático sobre C# 13, descobrindo os namespaces e bibliotecas da BCL. Melhore a performance e legibilidade do seu código..Xml ou libs específicas de CSV.

Uma estratégia comum é:

1. Receber o conteúdo via HttpResponseMessage.

2. Ler o stream de resposta.

3. Deserializar com a biblioteca adequada (por exemplo, XmlSerializer ou bibliotecas open-source como CsvHelper).

Exemplo simplificado de leitura de XML:

public async Task<TipoDeDado> ObterDadosXmlAsync()
{
    using var resposta = await _httpClient.GetAsync("https://api.exemplo.com/dados.xml");
    resposta.EnsureSuccessStatusCode();
    var stream = await resposta.Content.ReadAsStreamAsync();
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(TipoDeDado));
    if (serializer.Deserialize(stream) is TipoDeDado dados)
    {
        return dados;
    }
    throw new Exception("Falha ao deserializar XML.");
}

Boas Práticas de Performance e Legibilidade🔗

A integração com APIs pode se tornar um gargalo de desempenho caso não seja projetada corretamente. Aqui vão algumas práticas recomendadas:

1. Reutilize instâncias de HttpClient: em vez de criar uma nova instância sempre, injete HttpClient via dependency injectionUtilizando injeção de dependência e containers no C# 13Utilizando injeção de dependência e containers no C# 13Desvende a injeção de dependências no C# 13 e melhore a organização e performance do seu código com exemplos práticos e dicas valiosas. ou mantenha uma instância estática.

2. Tratamento de erros centralizado: definir handlers que interceptem exceções e façam registro em log ou retentativas.

3. Configure timeouts: evite que seu código fique aguardando respostas indefinidamente.

4. Use async e await com sabedoria: priorize métodos assíncronosRefinando o uso de 'async' e 'await' com novas funcionalidades do C# 13Refinando o uso de 'async' e 'await' com novas funcionalidades do C# 13Explore as melhorias do C# 13 em 90 minutos com exemplos práticos que aprimoram o uso de async/await, elevando a legibilidade e o desempenho do seu código. para não bloquear threads importantes.

public class HttpClientFactory
{
    private static readonly Lazy<HttpClient> _cliente = new(() =>
    {
        var httpClient = new HttpClient
        {
            Timeout = TimeSpan.FromSeconds(30)
        };
        // Exemplificando a configuração de base address
        httpClient.BaseAddress = new Uri("https://api.exemplo.com/");
        return httpClient;
    });
    public static HttpClient Client => _cliente.Value;
}

Neste exemplo simplificado, usamos Lazy<T> para criar uma instância única de HttpClient que será compartilhada pela aplicação, evitando a criação de vários sockets.

Tratamento Avançado de Exceções🔗

Quando falamos de integrações, é comum lidar com situações em que a API externa retorna erros de negócio, status HTTP inesperados ou mesmo problemas de rede. No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. e melhorias no when clause podem ajudar a refinar o tratamento das exceções.

public async Task<ResultadoUsuario> ObterUsuarioAsync(int id)
{
    try
    {
        return await _httpClient.GetFromJsonAsync<ResultadoUsuario>($"usuarios/{id}")
               ?? throw new Exception("Resposta nula para usuário.");
    }
    catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
    {
        // Podemos tratar 404 de forma específica
        throw new Exception($"Usuário {id} não encontrado.");
    }
    catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.BadRequest)
    {
        // Outra lógica para 400
        throw new Exception($"Requisição inválida para o usuário {id}.");
    }
}

O pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. permite capturar de forma mais específica o cenário em que ocorreu a exceção, adicionando clareza a como a aplicação deve reagir.

Lidando com Serviços Assíncronos e Streaming🔗

Algumas APIs fornecem dados de forma streaming, ou seja, por meio de atualizações em tempo real. Para esses casos, o C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. mantém a sintaxe de async e await, porém pode-se aproveitar melhor o await foreach em streams de dados, principalmente quando combinadas com bibliotecas como System.IO.Pipelines ou SignalRMesclando Web e VR para aplicações interativas com C# 13Mesclando Web e VR para aplicações interativas com C# 13Descubra como integrar Web e VR com C# 13, usando SignalR para comunicação em tempo real e renderização 3D, criando experiências virtuais inovadoras., caso sejam cenários de real-time.

Um pequeno trecho ilustrativo do await foreach (embora esse exemplo dependa de bibliotecas específicas para streaming de fato):

public async IAsyncEnumerable<DadoRecebido> LerDadosEmTempoReal()
{
    // Exemplo fictício
    await foreach (var dado in _servicoTempoReal.ObterStreamDeDados())
    {
        yield return dado;
    }
}

Embora não seja exatamente como a maioria das integrações REST funcionam, o conceito de streaming usando IAsyncEnumerable e await foreach se integra muito bem à linguagem, permitindo processar dados à medida que são recebidos.

Conclusão🔗

A integração com APIs e serviços externos em C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. segue o mesmo fluxo geral de consumo de HTTP, mas com refinamentos que tornam seu código mais conciso, seguro e performático. As principais vantagens que compõem o cenário atual incluem:

Seguindo esses conceitos, você consegue integrar diversas aplicações e serviços em poucos minutos de código, eliminando complexidade acidental e mantendo a legibilidade e desempenho no topo. Dominar essas técnicas é essencial quando se pretende evoluir para aplicações distribuídas, microserviços e cenários de alta disponibilidade com C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET..

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados