What are Minimal APIs?
Minimal APIs provide a streamlined way to build HTTP APIs with minimal code and ceremony. Introduced in .NET 6 and enhanced in .NET 7/8/9/10.
Basic Minimal API
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapGet("/products", () => new[] { "Product1", "Product2" });
app.MapGet("/products/{id}", (int id) => $"Product {id}");
app.MapPost("/products", (Product product) =>
{
// Save product
return Results.Created($"/products/{product.Id}", product);
});
app.Run();
Route Parameters and Binding
// Route parameters
app.MapGet("/users/{id}", (int id) => $"User {id}");
// Query parameters
app.MapGet("/search", (string? q, int page = 1) => $"Search: {q}, Page: {page}");
// Body binding
app.MapPost("/users", (User user) => Results.Ok(user));
// Header binding
app.MapGet("/auth", ([FromHeader(Name = "X-Api-Key")] string apiKey) => $"Key: {apiKey}");
Dependency Injection
builder.Services.AddScoped();
app.MapGet("/products", (IProductService service) =>
service.GetAll());
app.MapGet("/products/{id}", async (int id, IProductService service) =>
await service.GetByIdAsync(id) is Product p
? Results.Ok(p)
: Results.NotFound());
Returning Results
app.MapGet("/products/{id}", (int id) =>
{
var product = GetProduct(id);
return product is not null
? Results.Ok(product)
: Results.NotFound();
});
// TypedResults for better OpenAPI support (.NET 7+)
app.MapGet("/products/{id}", (int id) =>
{
var product = GetProduct(id);
return product is not null
? TypedResults.Ok(product)
: TypedResults.NotFound();
});
Route Groups (.NET 7+)
var products = app.MapGroup("/api/products");
products.MapGet("/", () => GetAllProducts());
products.MapGet("/{id}", (int id) => GetProduct(id));
products.MapPost("/", (Product p) => CreateProduct(p));
products.MapPut("/{id}", (int id, Product p) => UpdateProduct(id, p));
products.MapDelete("/{id}", (int id) => DeleteProduct(id));
Adding Filters and Middleware
// Endpoint filter
app.MapGet("/products", () => GetProducts())
.AddEndpointFilter(async (context, next) =>
{
// Before
var result = await next(context);
// After
return result;
});
// Require authorization
app.MapGet("/admin", () => "Admin only")
.RequireAuthorization();
OpenAPI/Swagger Support
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapGet("/products", () => GetProducts())
.WithName("GetProducts")
.WithOpenApi()
.Produces>(200);
When to Use Minimal APIs
- Use Minimal APIs: Microservices, simple APIs, prototypes
- Use Controllers: Complex APIs, extensive filtering, large teams