Ihre erste Minimal API erstellen
Erstellen Sie ein Minimal-API-Projekt, definieren Sie Route-Handler und geben Sie typisierte Ergebnisse mit minimalem Boilerplate-Code zurück.
Ihre erste Minimal API erstellen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was sind Minimal APIs?
Minimal APIs, die mit .NET 6 eingeführt wurden, ermöglichen den Aufbau von HTTP-Endpunkten mit wenig Boilerplate – ohne Controller und Aktionsattribute, sondern mit direkt in Program.cs definierten Routenhandlern. Sie eignen sich ideal für Microservices und leichtgewichtige APIs.
Die einfachste Minimal API
Eine vollständige HTTP-API in nur wenigen Zeilen. Die Methoden MapGet, MapPost, MapPut und MapDelete definieren Routenhandler für jedes HTTP-Verb.
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 controllersTypisierte Ergebnisse für korrekte HTTP-Antworten
Verwenden Sie Results oder TypedResults für korrekte HTTP-Statuscodes und Inhaltstypen. TypedResults wird für die Inferenz von OpenAPI-Schemas bevorzugt.
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);
});Routenparameter und Query-Strings
Routenparameter werden aus dem URL-Pfad erfasst, Query-String-Parameter automatisch aus der Abfrage gebunden und der Request-Body aus JSON deserialisiert.
// 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 in Routenhandlern
Im DI-Container registrierte Services können direkt als Parameter von Routenhandlern injiziert werden. Das Framework löst sie automatisch auf.
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();
});Binden des Request-Bodys
Parameter, die registrierten Services entsprechen, werden injiziert; alle übrigen werden aus dem Request-Body gebunden (standardmäßig aus JSON). Verwenden Sie bei Bedarf explizit [FromBody].
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);
});Unterschiedliche Statuscodes zurückgeben
Results stellt Factory-Methoden für alle gängigen HTTP-Antworten bereit. Verwenden Sie diese für semantisch korrekte REST-APIs.
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()Metadaten mit WithName und WithTags hinzufügen
Fügen Sie Endpunkten Metadaten hinzu, um Dokumentation und Routing zu verbessern. Verwenden Sie WithName, WithTags und WithSummary für eine übersichtliche OpenAPI-Ausgabe.
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);
}Autorisierung in Minimal APIs
Wenden Sie RequireAuthorization() an, um Endpunkte zu schützen, oder verwenden Sie AllowAnonymous(), um den Schutz zu deaktivieren. Richtlinien funktionieren genauso wie bei Controllern.
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();Organisieren mit statischen Methoden
Bei größeren APIs können Sie Routenhandler in statische Methoden oder Erweiterungsmethoden verschieben, damit Program.cs übersichtlich und gut navigierbar bleibt.
// 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();Praxisbeispiel: Vollständige Minimal API für CRUD
Eine vollständige minimale CRUD-API für eine Todo-Ressource – kompakt, testbar und produktionsreif.
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();
});Kurzer Check
Wie erhält ein Routenhandler einer Minimal API einen registrierten DI-Dienst?
Zusammenfassung: Ihre erste Minimal API erstellen
Wichtige Erkenntnisse:
- MapGet/Post/Put/Delete definieren Routenhandler direkt in Program.cs
- Verwenden Sie
Results/TypedResultsfür korrekte HTTP-Statuscodes - Routen-, Query-, Body- und DI-Parameter werden automatisch gebunden
- Verwenden Sie
RequireAuthorization()undAllowAnonymous()für die Authentifizierung - Organisieren Sie große APIs mit Erweiterungsmethoden oder Routengruppen
Häufig gestellte Fragen
Ist die Lektion „Ihre erste Minimal API erstellen“ kostenlos?
Ja — der vollständige Text von „Ihre erste Minimal API erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Ihre erste Minimal API erstellen“?
Erstellen Sie ein Minimal-API-Projekt, definieren Sie Route-Handler und geben Sie typisierte Ergebnisse mit minimalem Boilerplate-Code zurück. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Ihre erste Minimal API erstellen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ihre erste Minimal API erstellen
- Route-Gruppen, Parameter und Validierung
- Middleware und Filter in Minimal APIs
- OpenAPI, Versionierung und Deployment