Athom 1.0.3
dotnet add package Athom --version 1.0.3
NuGet\Install-Package Athom -Version 1.0.3
<PackageReference Include="Athom" Version="1.0.3" />
<PackageVersion Include="Athom" Version="1.0.3" />
<PackageReference Include="Athom" />
paket add Athom --version 1.0.3
#r "nuget: Athom, 1.0.3"
#:package Athom@1.0.3
#addin nuget:?package=Athom&version=1.0.3
#tool nuget:?package=Athom&version=1.0.3
Nova Camada de Requisições HTTP
Esta documentação descreve a nova camada de abstração para requisições HTTP, projetada para ser flexível, robusta e alinhada com os princípios de SOLID e Clean Code. A arquitetura permite o desacoplamento total entre a lógica de negócio e os detalhes de infraestrutura, como o cliente HTTP e os métodos de autenticação.
Estrutura e Componentes
A solução é organizada em três camadas principais, com a seguinte estrutura de pastas:
Athom/Processamento/Requisicao
: Contém os modelos de retorno que encapsulam o resultado de cada operação.OperationStatus.cs
: Umenum
que define o estado semântico de uma operação (ex:Success
,NotFound
,ServerError
).RequestModel<T>.cs
: A classe principal que encapsula o resultado da requisição, incluindo o status da operação, o código HTTP, a mensagem e o resultado tipado.
Athom/Servico
: Camada de serviço que define os contratos (interfaces) e as implementações de funcionalidades de negócio e utilitários.IHttpService.cs
: A interface que define o contrato para o serviço de requisições.IAuth.cs
: Interface para a aplicação de autenticação.IRequestBody.cs
: Interface para a criação de diferentes tipos de corpo de requisição.
Athom/Infra/Http
: Camada de infraestrutura que contém a implementação concreta doIHttpService
.HttpService.cs
: A classe que utilizaHttpClient
para executar as requisições e mapear os resultados para umRequestModel
.
Funcionamento e Implementação
O fluxo de uso da nova camada é simples e direto, seguindo o padrão de Inversão de Dependência (DIP).
1. Configuração no Startup.cs
ou Program.cs
Para que o sistema de injeção de dependência funcione corretamente, é necessário registrar o HttpClient
e o HttpService
na inicialização da sua aplicação.
public void ConfigureServices(IServiceCollection services)
{
// Registra o HttpClient para o HttpService, garantindo um ciclo de vida adequado.
services.AddHttpClient<IHttpService, HttpService>();
// Registra o serviço para obter tokens OAuth2, se necessário.
services.AddTransient<IOAuth2TokenService, ClientCredentialsTokenService>(provider =>
{
// Exemplo: valores de configuração obtidos de appsettings.json
var httpClient = provider.GetRequiredService<HttpClient>();
var tokenEndpoint = Configuration["OAuth:TokenEndpoint"];
var clientId = Configuration["OAuth:ClientId"];
var clientSecret = Configuration["OAuth:ClientSecret"];
return new ClientCredentialsTokenService(httpClient, tokenEndpoint, clientId, clientSecret);
});
// Demais serviços...
}
2. Utilização em um Serviço de Domínio
Dentro de um serviço de negócio, injete a interface IHttpService
e use o método SendAsync
para executar as requisições. O serviço de negócio não precisa saber dos detalhes de implementação do HTTP.
public class UsuarioService : IUsuarioService
{
private readonly IHttpService _httpService;
public UsuarioService(IHttpService httpService)
{
_httpService = httpService;
}
public async Task<RequestModel<Usuario>> ObterUsuarioPorIdAsync(Guid usuarioId, string token)
{
// 1. Cria a autenticação.
var auth = new BearerAuth(token);
// 2. Chama o método genérico SendAsync do IHttpService.
// O IHttpService cuida de toda a complexidade da requisição.
var result = await _httpService.SendAsync<Usuario>(
method: HttpMethodType.Get,
uri: $"https://api.exemplo.com/v1/usuarios/{usuarioId}",
auth: auth);
// 3. Verifica o status da operação e atua de acordo.
if (result.IsSuccess)
{
Console.WriteLine($"Usuário encontrado: {result.Result.Nome}");
}
else if (result.IsNotFound)
{
Console.WriteLine($"Erro: Usuário não encontrado. Mensagem: {result.Message}");
}
else
{
Console.WriteLine($"Ocorreu um erro inesperado: {result.Message}");
// Lançar exceção ou tratar o erro de outra forma, se necessário.
}
return result;
}
}
Classes de Suporte Detalhadas
OperationStatus
: Esteenum
é a espinha dorsal do nosso sistema de retorno. Em vez de códigos HTTP, ele fornece um estado semântico da operação.RequestModel<T>
: Representa o retorno da operação.- Métodos de Fábrica Estáticos: O
RequestModel
é imutável. Use os métodos de fábrica comoRequestModel.Success()
,RequestModel.NotFound()
, etc., para criar instâncias. - Propriedades de Verificação: Propriedades como
IsSuccess
eIsNotFound
facilitam a verificação do resultado da operação em estruturas de controle comoif/else
ouswitch
.
- Métodos de Fábrica Estáticos: O
IAuth
e Implementações: Define o contrato para a autenticação. AHttpService
não precisa saber se é um token Bearer, Basic ou OAuth2; ela simplesmente chama o métodoApply()
para adicionar a autenticação.IRequestBody
e Implementações: Lida com a complexidade de serializar o corpo da requisição para diferentes formatos, como JSON oumultipart/form-data
.HttpService
: A implementação que orquestra a requisição. Ela constrói a URL, aplica a autenticação e o corpo, envia a requisição e, o mais importante, mapeia o código de status HTTP da resposta para o nossoOperationStatus
.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- Microsoft.AspNetCore.Mvc.Abstractions (>= 2.3.0)
- Microsoft.AspNetCore.Mvc.Core (>= 2.3.0)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 9.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.