Building Minimal APIs in ASP.NET Core Print

  • 0

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

Was this answer helpful?

« Back