C# Academy · leksjon

Opprett din første Minimal API

Start et Minimal API-prosjekt, definer rutebehandlere og returner typesikre resultater med minimalt med overflødig kode.

Leksjon 1 av 413 trinn

Opprett din første Minimal API er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva er Minimal API-er

Minimal API-er, som ble introdusert i .NET 6, lar deg bygge HTTP-endepunkter med minimalt med oppsett – ingen kontrollere eller action-attributter, bare rutehandlere som defineres direkte i Program.cs. De passer godt til mikrotjenester og lette API-er.

Det enkleste Minimal API-et

Et komplett HTTP-API på bare noen få linjer. Metodene MapGet, MapPost, MapPut og MapDelete definerer rutehandlere for hver HTTP-metode.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello, Minimal API!");
app.MapGet("/ping", () => Results.Ok(new { status = "pong" }));

app.Run();
// That's it — no Startup.cs, no controllers

Typed Results for korrekte HTTP-svar

Bruk Results eller TypedResults for riktige HTTP-statuskoder og innholdstyper. TypedResults foretrekkes fordi det gir bedre inferens av OpenAPI-skjemaet.

app.MapGet("/products/{id}", async (int id, AppDbContext db) =>
{
    var product = await db.Products.FindAsync(id);
    return product is null
        ? Results.NotFound()
        : Results.Ok(product);
});

app.MapPost("/products", async (Product product, AppDbContext db) =>
{
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Results.Created($"/products/{product.Id}", product);
});

Ruteparametere og query strings

Ruteparametere hentes fra URL-stien, query string-parametere bindes automatisk fra spørringen, og request body deserialiseres fra JSON.

// Route param {id} + query param ?includeDeleted
app.MapGet("/orders/{id}", async (
    int id,
    bool includeDeleted = false,
    AppDbContext db) =>
{
    var query = db.Orders.AsQueryable();
    if (!includeDeleted) query = query.Where(o => !o.IsDeleted);
    var order = await query.FirstOrDefaultAsync(o => o.Id == id);
    return order is null ? Results.NotFound() : Results.Ok(order);
});

Dependency Injection i rutehandlere

Tjenester som er registrert i DI-containeren, kan injiseres direkte som parametere til rutehandlere. Rammeverket løser dem automatisk.

builder.Services.AddScoped<ProductService>();

app.MapGet("/products", async (ProductService svc) =>
{
    var products = await svc.GetAllAsync();
    return Results.Ok(products);
});

app.MapDelete("/products/{id}", async (int id, ProductService svc) =>
{
    var deleted = await svc.DeleteAsync(id);
    return deleted ? Results.NoContent() : Results.NotFound();
});

Binding av request body

Parametere som samsvarer med registrerte tjenester, injiseres; alle andre bindes fra request body (JSON som standard). Bruk [FromBody] eksplisitt ved behov.

record CreateProductRequest(string Name, decimal Price, int Stock);

app.MapPost("/products", async (
    CreateProductRequest req,
    ProductService svc) =>
{
    var product = await svc.CreateAsync(req.Name, req.Price, req.Stock);
    return TypedResults.Created($"/products/{product.Id}", product);
});

Returnere ulike statuskoder

Results tilbyr fabrikkmetoder for alle vanlige HTTP-svar. Bruk dem for semantisk korrekte REST-API-er.

app.MapPut("/products/{id}", async (int id, Product update, AppDbContext db) =>
{
    var existing = await db.Products.FindAsync(id);
    if (existing is null) return Results.NotFound();

    existing.Name  = update.Name;
    existing.Price = update.Price;
    await db.SaveChangesAsync();
    return Results.Ok(existing);
});

// Other useful Results:
// Results.BadRequest("message")
// Results.Conflict()
// Results.UnprocessableEntity(errors)
// Results.Accepted()

Legge til metadata med WithName og WithTags

Legg metadata til endepunkter for å forbedre dokumentasjon og ruting. Bruk WithName, WithTags og WithSummary for et organisert OpenAPI-resultat.

app.MapGet("/products/{id}", GetProduct)
   .WithName("GetProductById")
   .WithTags("Products")
   .WithSummary("Retrieves a product by its ID")
   .Produces<Product>()
   .Produces(404);

static async Task<IResult> GetProduct(int id, AppDbContext db)
{
    var p = await db.Products.FindAsync(id);
    return p is null ? Results.NotFound() : Results.Ok(p);
}

Autorisasjon i Minimal API-er

Bruk RequireAuthorization() for å beskytte endepunkter, eller AllowAnonymous() for å unnta et endepunkt. Policyer fungerer på samme måte som i kontrollere.

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();

app.UseAuthentication();
app.UseAuthorization();

app.MapGet("/profile", (ClaimsPrincipal user) =>
    Results.Ok(user.Identity!.Name))
   .RequireAuthorization();

app.MapGet("/public", () => "No auth needed")
   .AllowAnonymous();

Organisering med statiske metoder

For større API-er kan rutebehandlere flyttes til statiske metoder eller utvidelsesmetoder for å holde Program.cs ryddig og lett å navigere i.

// Extension method groups endpoints by feature
public static class ProductEndpoints
{
    public static void MapProductEndpoints(this WebApplication app)
    {
        app.MapGet("/products",    GetAll);
        app.MapGet("/products/{id}", GetById);
        app.MapPost("/products",   Create);
    }

    private static async Task<IResult> GetAll(AppDbContext db)
        => Results.Ok(await db.Products.AsNoTracking().ToListAsync());

    // ... other handlers
}

// In Program.cs:
app.MapProductEndpoints();

I praksis: Komplett Minimal API med CRUD

Et komplett Minimal API for en Todo-ressurs – kortfattet, testbart og klart for produksjon.

app.MapGet("/todos", async (AppDbContext db) =>
    Results.Ok(await db.Todos.AsNoTracking().ToListAsync()));

app.MapGet("/todos/{id}", async (int id, AppDbContext db) =>
{
    var todo = await db.Todos.FindAsync(id);
    return todo is null ? Results.NotFound() : Results.Ok(todo);
});

app.MapPost("/todos", async (Todo todo, AppDbContext db) =>
{
    db.Todos.Add(todo);
    await db.SaveChangesAsync();
    return Results.Created($"/todos/{todo.Id}", todo);
});

app.MapDelete("/todos/{id}", async (int id, AppDbContext db) =>
{
    int n = await db.Todos.Where(t => t.Id == id).ExecuteDeleteAsync();
    return n > 0 ? Results.NoContent() : Results.NotFound();
});

Rask sjekk

Hvordan mottar en rutebehandler i en Minimal API en registrert DI-tjeneste?

Oppsummering: Opprette den første Minimal API-en

Viktige punkter:

  • MapGet/Post/Put/Delete definerer rutebehandlere direkte i Program.cs
  • Bruk Results / TypedResults for riktige HTTP-statuskoder
  • Rute-, spørrings-, brødtekst- og DI-parametere bindes automatisk
  • Bruk RequireAuthorization() og AllowAnonymous() for autentisering
  • Organiser store API-er med utvidelsesmetoder eller rutegrupper
Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «Opprett din første Minimal API» gratis?

Ja – hele teksten i «Opprett din første Minimal API» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Opprett din første Minimal API»?

Start et Minimal API-prosjekt, definer rutebehandlere og returner typesikre resultater med minimalt med overflødig kode. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Opprett din første Minimal API»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Opprett din første Minimal API
  2. Rutegrupper, parametere og validering
  3. Middleware og filtre i Minimal APIs
  4. OpenAPI, versjonering og utrulling
← Tilbake til C# Academy