Requisições HTTP com o Flurl em .NET

Requisições HTTP com Flurl

As requisições HTTP são parte fundamental de muitas aplicações, especialmente quando precisamos interagir com APIs externas. O Flurl é uma biblioteca que facilita tanto a construção quanto o envio de requisições HTTP.

O que é o Flurl?

O nome “Flurl” é um trocadilho com “Fluent URL”, refletindo a principal característica da biblioteca: oferecer recursos fluentes para construir URLs. A própria biblioteca se define como “um construtor de URLs moderno, fluente, assíncrono, fácil de testar, portátil, repleto de buzzwords (palavras da moda), e uma biblioteca que também funciona como um cliente HTTP para .NET.”. Esta descrição destaca a versatilidade e a ampla gama de recursos que o Flurl oferece para desenvolvedores que trabalham com HTTP em aplicações .NET.

Preparando o ambiente

Para começar a usar o Flurl, você precisa instalar o pacote NuGet no seu projeto .NET. Isso pode ser feito de duas formas: executando o comando abaixo no terminal do .NET CLI:

				
					dotnet add package Flurl.Http
				
			

Ou, alternativamente, usando o NuGet Package Manager Console no Visual Studio com o seguinte comando:

				
					Install-Package Flurl.Http
				
			

Para os exemplos práticos, utilizaremos o serviço “jsonplaceholder” para realizar nossas requisições HTTP e manipular dados. Este serviço fornece uma API REST falsa que é útil para testar e prototipar chamadas HTTP.

Fazendo uma requisição GET

Vamos começar com um exemplo básico de como fazer uma requisição HTTP GET usando o Flurl. E para este exemplo utilizaremos a seguinte classe de modelo/DTO:

				
					public class Post
{
     public int Id { get; set; }
     public string Title { get; set; }
     public string Body { get; set; }
}

				
			

Para fazer uma requisição GET  a fim de obter uma coleção de objetos do tipo Post, podemos proceder da seguinte forma:

				
					string apiUrl = "https://jsonplaceholder.typicode.com/posts"; 
var response = await apiUrl.GetJsonAsync<Post[]>();
				
			

Neste exemplo, a variável “apiUrl” armazena a URL da API. O método “GetJsonAsync<Post[]>()” realiza uma requisição HTTP GET para a URL especificada e automaticamente desserializa a resposta JSON em um array de objetos “Post”. Isso elimina a necessidade de código adicional para manipular a resposta JSON.

Enviando dados com uma requisição POST

Para enviar dados a uma API, usamos uma requisição POST. Essa requisição é ideal quando precisamos criar novos recursos no servidor. Vamos demonstrar como enviar um novo post para o serviço de API jsonplaceholder.

Primeiro, definimos o objeto que queremos enviar, contendo as informações do novo post:

				
					var newPost = new
{
    title = "Requisições HTTP com o Flurl em .NET",
    body = "Flurl é uma biblioteca incrível para fazer requisições HTTP em .NET!",
    userId = 1
}

				
			

Neste exemplo, estamos criando um objeto anônimo ”newPost” que contém o título, o corpo da mensagem e o Id do usuário autor do post. Em seguida, enviamos esse objeto para a API usando o método POST.

				
					string apiUrl = "https://jsonplaceholder.typicode.com/posts"; 
var response = await apiUrl.PostJsonAsync(newPost).ReceiveJson<Post>();

				
			

O método PostJsonAsync envia uma requisição POST com o objeto “newPost” que foi automaticamente serializado para o formato JSON. Após o envio da requisição, utilizamos o método “ReceiveJson<Post>()” para aguardar a resposta e desserializá-la diretamente em um objeto “Post”.

Tratamento de erros

Ao realizar requisições HTTP, é importante lidar com possíveis erros que possam ocorrer durante a comunicação com o servidor, como tempo de espera excedido (timeout), falhas de rede ou respostas com códigos de status indicando erro (como 404 ou 500). O Flurl facilita o tratamento desses erros ao lançar exceções específicas que podemos capturar e tratar de forma adequada.

				
					try
{
   string apiUrl = "https://jsonplaceholder.typicode.com/posts"; 

    var response = await apiUrl.GetJsonAsync<Post[]>();
}
catch (FlurlHttpTimeoutException)
{
    Console.WriteLine("A solicitação expirou.");
}
catch (FlurlHttpException ex) when (ex.Call.Response.StatusCode == 404)
{
    Console.WriteLine("Recurso não encontrado.");
}
catch (FlurlHttpException ex)
{
    Console.WriteLine($"Ocorreu um erro: {ex.Message}");
}

				
			

Captura de exceção FlurlHttpTimeoutException: a primeira captura de exceção específica é para “FlurlHttpTimeoutException”. Essa exceção é lançada quando a requisição HTTP excede o tempo limite definido (timeout). No caso de um timeout, a mensagem “A solicitação expirou.” é exibida no console. Isso é útil para informar ao usuário que a requisição demorou muito para receber uma resposta do servidor.

Captura de exceção FlurlHttpException com condição de status code 404: A segunda captura de exceção é para “FlurlHttpException” com uma condição específica: “ex.Call.Response.StatusCode == 404”. Isso significa que, se o servidor retornar um código de status HTTP 404 (indicando que o recurso não foi encontrado), a exceção será capturada e a mensagem “Recurso não encontrado.” será exibida no console. Esta abordagem permite tratar de maneira diferenciada os casos onde o recurso solicitado não existe.

Captura geral de exceção FlurlHttpException: O último catch captura qualquer outra exceção do tipo “FlurlHttpException” que não foi tratada pelas condições anteriores. Essas exceções abrangem uma ampla gama de possíveis falhas de requisição HTTP, incluindo erros de servidor (como códigos de status 500), falhas de rede, entre outros. Ao capturar essa exceção, exibimos uma mensagem genérica de erro, juntamente com a mensagem de erro específica (ex.Message), que fornece mais detalhes sobre o problema ocorrido.

Download de arquivos

O Flurl também simplifica o download de arquivos. Vamos ver como baixar um arquivo de uma URL:

				
					string url = "https://nextwave.education/wp-content/uploads/2024/08/CapaHttpClient.png";
string nomeArquivo = "imagem.png";
string localSalvar = @"C:\Users\Public\Pictures";

await url.DownloadFileAsync(LocalSalvar, NomeArquivo);
Console.WriteLine($"Arquivo baixado com sucesso: {NomeArquivo}");

				
			

Utiliza-se o método “DownloadFileAsync” do Flurl para baixar o arquivo da URL fornecida e armazená-lo no diretório especificado com o nome desejado. Este método simplifica o processo de download ao cuidar da manipulação dos dados e da escrita do arquivo em disco.

Acelere a sua carreira conosco!

Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET StartClique aqui

Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET ExpertClique aqui

Conclusão

O Flurl é uma excelente opção para desenvolvedores .NET que procuram uma maneira fluente, simples e poderosa de realizar requisições HTTP. Com suporte para operações síncronas e assíncronas, tratamento de erros aprimorado, autenticação básica e OAuth 2.0, download de arquivos e integração direta com JSON, o Flurl se destaca como uma ferramenta essencial para trabalhar com APIs REST.

Experimente o Flurl em seu próximo projeto e veja como ele pode simplificar a forma como você trabalha com requisições HTTP em .NET!