Exploring Minimal APIs
Build lightweight APIs with ASP.NET Core minimal APIs.
By EMEPublished: February 20, 2025
minimal apisaspnet corelightweightrouting
A Simple Analogy
Minimal APIs are like a fast-food counter. No bloat, just order → execute → deliver.
Why Minimal APIs?
- Lightweight: Less ceremony than controllers
- Fast: Reduced overhead
- Modern: C# 10+ features
- Testing: Easy to test
- Microservices: Perfect for small services
Basic Endpoints
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// GET endpoint
app.MapGet("/products/{id}", GetProduct)
.WithName("GetProduct")
.WithOpenApi();
// POST endpoint
app.MapPost("/products", CreateProduct)
.WithValidation()
.WithOpenApi();
// PUT endpoint
app.MapPut("/products/{id}", UpdateProduct);
// DELETE endpoint
app.MapDelete("/products/{id}", DeleteProduct);
app.Run();
async Task<IResult> GetProduct(int id)
{
var product = await _db.Products.FindAsync(id);
return product != null ? Results.Ok(product) : Results.NotFound();
}
async Task<IResult> CreateProduct(CreateProductRequest request)
{
var product = new Product { Name = request.Name, Price = request.Price };
_db.Products.Add(product);
await _db.SaveChangesAsync();
return Results.Created($"/products/{product.Id}", product);
}
Groups & Organization
var productGroup = app.MapGroup("/api/products")
.WithTags("Products");
productGroup.MapGet("/", GetAllProducts);
productGroup.MapGet("/{id}", GetProduct);
productGroup.MapPost("/", CreateProduct);
var adminGroup = app.MapGroup("/api/admin")
.RequireAuthorization("AdminPolicy");
adminGroup.MapDelete("/products/{id}", DeleteProduct);
Dependency Injection
services.AddScoped<IProductService, ProductService>();
app.MapGet("/products", GetProducts);
async Task<IResult> GetProducts(IProductService service)
{
var products = await service.GetAllAsync();
return Results.Ok(products);
}
Authentication/Authorization
app.MapGet("/public", () => "Anyone can access")
.AllowAnonymous();
app.MapPost("/protected", () => "Authenticated users only")
.RequireAuthorization();
app.MapDelete("/admin/{id}", DeleteProduct)
.RequireAuthorization("AdminPolicy");
Best Practices
- Organize: Use groups for related endpoints
- Naming: Provide names for OpenAPI
- Validation: Use filter extensions
- Documentation: Add descriptions
- Error handling: Return appropriate status codes
Related Concepts
- MVC controllers
- REST principles
- OpenAPI/Swagger
- Routing
Summary
Minimal APIs simplify ASP.NET Core development. Perfect for modern microservices and lightweight applications.