HttpButler 1.0.1-alpha
dotnet add package HttpButler --version 1.0.1-alpha
NuGet\Install-Package HttpButler -Version 1.0.1-alpha
<PackageReference Include="HttpButler" Version="1.0.1-alpha" />
<PackageVersion Include="HttpButler" Version="1.0.1-alpha" />
<PackageReference Include="HttpButler" />
paket add HttpButler --version 1.0.1-alpha
#r "nuget: HttpButler, 1.0.1-alpha"
#:package HttpButler@1.0.1-alpha
#addin nuget:?package=HttpButler&version=1.0.1-alpha&prerelease
#tool nuget:?package=HttpButler&version=1.0.1-alpha&prerelease
HttpButler
HttpButler es una librería ligera de C# que simplifica la creación de clientes HTTP tipados generando automáticamente implementaciones de interfaces mediante source generators. Permite definir contratos HTTP declarativamente sin necesidad de escribir código repetitivo.
Características
- Source Generators: Genera automáticamente implementaciones de interfaces marcadas con
[HttpButler] - Atributos declarativos: Define rutas y métodos HTTP usando atributos
- Inyección de dependencias: Integración perfecta con
IServiceCollection - Tipado fuerte: Aprovecha el sistema de tipos de C# para validación en tiempo de compilación
- Parámetros flexibles: Soporte para parámetros en ruta, query y body
Instalación
Agrega el paquete HttpButler a tu proyecto:
dotnet add package HttpButler
También necesitarás el paquete del generador:
dotnet add package HttpButler.Generator
Uso Básico
1. Define una interfaz HTTP
Crea una interfaz con los atributos [HttpButler] y [Route]:
using HttpButler.Attributes;
public class Todo
{
public int UserId { get; set; }
public int Id { get; set; }
public string Title { get; set; } = string.Empty;
public bool Completed { get; set; }
}
[HttpButler]
[Route("https://jsonplaceholder.typicode.com/")]
public interface IJsonPlaceHolderTodo
{
[HttpGet("todos/{todoId}")]
Task<Todo?> GetTodoAsync(int todoId);
[HttpPost("todos")]
Task PostTodoAsync([ToBody] Todo todo);
}
2. Registra la interfaz en DI
En tu Program.cs, registra la interfaz usando AddHttpButler:
var builder = WebApplication.CreateBuilder(args);
// Se debe compilar el proyecto para que el generador cree las implementaciones antes de agregarlas
// Registrar todas las interfaces generadas automáticamente
builder.Services.AddHttpButler();
var app = builder.Build();
3. Usa la interfaz en tu código
Inyecta la interfaz y úsala como cualquier otro servicio:
[ApiController]
[Route("api/[controller]")]
public class TodosController : ControllerBase
{
private readonly IJsonPlaceHolderTodo _todoClient;
public TodosController(IJsonPlaceHolderTodo todoClient)
{
_todoClient = todoClient;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetTodo(int id)
{
var todo = await _todoClient.GetTodoAsync(id);
if (todo == null)
return NotFound();
return Ok(todo);
}
[HttpPost]
public async Task<IActionResult> CreateTodo([FromBody] Todo todo)
{
await _todoClient.PostTodoAsync(todo);
return Created();
}
}
Atributos Disponibles
[HttpButler]
Marca una interfaz como cliente HTTP. HttpButler generará automáticamente su implementación.
[HttpButler]
public interface IMyApiClient
{
// métodos...
}
[Route]
Define la URL base para el cliente HTTP.
[Route("https://api.example.com/v1/")]
public interface IMyApiClient
{
// métodos...
}
Atributos de Método HTTP
[HttpGet(path)]- Solicitud GET[HttpPost(path)]- Solicitud POST[HttpPut(path)]- Solicitud PUT[HttpDelete(path)]- Solicitud DELETE
[HttpGet("users")]
Task<List<User>> GetUsersAsync();
[HttpPost("users")]
Task CreateUserAsync([ToBody] User user);
Atributos de Parámetro
[ToRoute]- Parámetro en la ruta (reemplaza{paramName})[ToQuery]- Parámetro de query string[ToBody]- Cuerpo de la solicitud
[HttpGet("users/{id}")]
Task<User> GetUserAsync([ToRoute] int id);
[HttpGet("users")]
Task<List<User>> SearchUsersAsync([ToQuery] string name, [ToQuery] int age);
[HttpPost("users")]
Task CreateUserAsync([ToBody] User user);
Cómo Funciona
- Atributos: Defines una interfaz con atributos que describen las llamadas HTTP
- Source Generator: Durante la compilación,
InterfaceImplementationGeneratorescanea las interfaces marcadas con[HttpButler] - Generación de Código: Genera automáticamente una clase implementación (ej:
gHttpButler_IJsonPlaceHolderTodo) que implementa la interfaz - Inyección de Dependencias: Registra la interfaz y su implementación en el contenedor DI
- Uso: Inyecta la interfaz en tus controladores o servicios y úsala normalmente
Arquitectura
HttpButler/
├── Attributes/ # Atributos para definir clientes HTTP
├── Services/ # Servicios auxiliares
│ ├── IHttpClientService # Interfaz para manejar solicitudes HTTP
│ └── IPathResolveService # Interfaz para resolver rutas y parámetros
└── ServiceCollectionExtension # Métodos de extensión para DI
HttpButler.Generator/
└── InterfaceImplementationGenerator # Source Generator que crea las implementaciones
Ejemplo Completo
Consulta HttpButler.TestApi para ver un ejemplo funcional que usa IJsonPlaceHolderTodo para consumir la API de JSONPlaceholder.
// Services/IJsonPlaceHolderTodo.cs
[HttpButler]
[Route("https://jsonplaceholder.typicode.com/")]
public interface IJsonPlaceHolderTodo
{
[HttpGet("todos/{todoId}")]
Task<Todo?> GetTodoAsync(int todoId);
[HttpPost("todos")]
Task PostTodoAsync([ToBody] Todo todo);
}
// Program.cs
builder.Services.AddHttpButler();
// Controllers/TodosController.cs
[ApiController]
public class TodosController : ControllerBase
{
private readonly IJsonPlaceHolderTodo _client;
public TodosController(IJsonPlaceHolderTodo client) => _client = client;
[HttpGet("{id}")]
public Task<Todo?> GetTodo(int id) => _client.GetTodoAsync(id);
}
Licencia
MIT License - Ver LICENSE.txt para más detalles.
Contribuir
Las contribuciones son bienvenidas. Por favor abre un issue o un pull request para reportar bugs o sugerir mejoras.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Http (>= 8.0.1)
- System.Net.Http.Json (>= 8.0.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on HttpButler:
| Package | Downloads |
|---|---|
|
HttpButler.Generator
Generator de HttpButler, librería ligera de C# que simplifica la creación de clientes HTTP tipados generando automáticamente implementaciones de interfaces mediante source generators. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.1-alpha | 64 | 11/28/2025 |
| 1.0.0-alpha | 72 | 11/28/2025 |