Opret din første Minimal API
Opret et Minimal API-projekt, definér route handlers, og returnér typede resultater med minimal boilerplate.
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 controllersTyped 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/TypedResultstil korrekte HTTP-statuskoder - Parametre fra rute, forespørgsel, brødtekst og DI bindes automatisk
- Brug
RequireAuthorization()ogAllowAnonymous()til godkendelse - Organisér store API'er med udvidelsesmetoder eller rutegrupper
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
- Opret din første Minimal API
- Route-grupper, parametre og validering
- Middleware og filtre i Minimal APIs
- OpenAPI, versionering og udrulning