C# Academy · Lektion

Opret din første Minimal API

Opret et Minimal API-projekt, definér route handlers, og returnér typede resultater med minimal boilerplate.

Lektion 1 af 413 trin

Opret din første Minimal API er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad er Minimal APIs

Minimal APIs, der blev introduceret i .NET 6, lader dig bygge HTTP-endepunkter med et minimum af overflødigt kodearbejde – ingen controllere og ingen handlingsattributter, kun rutehåndteringer, der er defineret direkte i Program.cs. De er ideelle til mikrotjenester og lette API'er.

Den enkleste Minimal API

En komplet HTTP-API på blot nogle få linjer. Metoderne MapGet, MapPost, MapPut og MapDelete definerer rutehåndteringer for hvert HTTP-verbum.

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 til korrekte HTTP-svar

Brug Results eller TypedResults til korrekte HTTP-statuskoder og indholdstyper. TypedResults foretrækkes, når OpenAPI-skemaet skal udledes.

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);
});

Ruteparametre og forespørgselsstrenge

Ruteparametre hentes fra URL-stien, parametre i forespørgselsstrengen bindes automatisk fra forespørgslen, og anmodningens brødtekst 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);
});

Afhængighedsinjektion i rutehåndteringer

Tjenester, der er registreret i DI-beholderen, kan injiceres direkte som parametre til rutehåndteringen. Rammeværket finder 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 af anmodningens brødtekst

Parametre, der svarer til registrerede tjenester, injiceres; alt andet bindes fra anmodningens brødtekst (JSON som standard). Brug [FromBody] eksplicit, hvis det er nødvendigt.

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);
});

Returnering af forskellige statuskoder

Results indeholder fabriksmetoder til alle almindelige HTTP-svar. Brug dem til 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()

Tilføj metadata med WithName og WithTags

Vedhæft metadata til endepunkter for at forbedre dokumentation og routing. Brug WithName, WithTags og WithSummary til et organiseret OpenAPI-output.

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);
}

Godkendelse i Minimal APIs

Anvend RequireAuthorization() for at beskytte endepunkter, eller brug AllowAnonymous() til at fravælge beskyttelsen. Politikker fungerer på samme måde som i controllere.

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 du flytte rutehandlere til statiske metoder eller udvidelsesmetoder, så Program.cs forbliver overskuelig og nem at 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();

Praktisk eksempel: Komplet CRUD-Minimal API

En komplet CRUD-Minimal API til en Todo-ressource – kortfattet, testbar og klar til produktion.

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();
});

Hurtigt tjek

Hvordan modtager en rutehandler i en Minimal API en registreret DI-tjeneste?

Opsummering: Oprettelse af din første Minimal API

Vigtigste pointer:

  • MapGet/Post/Put/Delete definerer rutehandlere direkte i Program.cs
  • Brug Results / TypedResults til korrekte HTTP-statuskoder
  • Parametre fra rute, forespørgsel, brødtekst og DI bindes automatisk
  • Brug RequireAuthorization() og AllowAnonymous() til godkendelse
  • Organisér store API'er med udvidelsesmetoder eller rutegrupper
Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Opret din første Minimal API” gratis?

Ja — hele teksten til “Opret din første Minimal API” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Opret din første Minimal API”?

Opret et Minimal API-projekt, definér route handlers, og returnér typede resultater med minimal boilerplate. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Opret din første Minimal API”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Opret din første Minimal API
  2. Route-grupper, parametre og validering
  3. Middleware og filtre i Minimal APIs
  4. OpenAPI, versionering og udrulning
← Tilbage til C# Academy