Ensimmäisen Minimal API:n luominen
Luokaa Minimal API -projekti, määrittäkää reittikäsittelijät ja palauttakaa tyypitettyjä tuloksia mahdollisimman vähäisellä oheiskoodilla.
Ensimmäisen Minimal API:n luominen on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mitä Minimal API:t ovat
.NET 6:ssa esiteltyjen Minimal API:en avulla HTTP-päätepisteitä voi rakentaa vähäisellä muodollisella rakenteella — ei ohjaimia eikä toimintoattribuutteja, vaan suoraan Program.cs-tiedostossa määritettyjä reittikäsittelijöitä. Ne sopivat ihanteellisesti mikropalveluihin ja kevyisiin API:eihin.
Yksinkertaisin Minimal API
Täydellinen HTTP-API vain muutamalla koodirivillä. MapGet-, MapPost-, MapPut- ja MapDelete-metodit määrittävät reittikäsittelijät kullekin HTTP-verbille.
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 controllersTyypitetyt tulokset oikeita HTTP-vastauksia varten
Käyttäkää Results- tai TypedResults-tyyppejä oikeiden HTTP-tilakoodien ja sisältötyyppien palauttamiseen. TypedResults on suositeltava OpenAPI-skeeman päättelyä varten.
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);
});Reittiparametrit ja kyselymerkkijonot
Reittiparametrit poimitaan URL-polusta, kyselymerkkijonon parametrit sidotaan automaattisesti kyselystä ja pyynnön runko deserialisoidaan JSONista.
// 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);
});Riippuvuuksien injektointi reittikäsittelijöihin
DI-säilöön rekisteröidyt palvelut voidaan injektoida suoraan reittikäsittelijän parametreina. Kehys ratkaisee ne automaattisesti.
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();
});Pyynnön rungon sitominen
Rekisteröityjä palveluita vastaavat parametrit injektoidaan; kaikki muu sidotaan pyynnön rungosta (oletusarvoisesti JSON-muodossa). Käyttäkää [FromBody]-määritettä nimenomaisesti tarvittaessa.
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);
});Eri tilakoodien palauttaminen
Results tarjoaa tehdasmetodit kaikille yleisille HTTP-vastauksille. Käyttäkää niitä semanttisesti oikeiden REST-API:en toteuttamiseen.
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()Metatietojen lisääminen WithName- ja WithTags-metodeilla
Liittäkää päätepisteisiin metatietoja dokumentoinnin ja reitityksen parantamiseksi. Käyttäkää WithName-, WithTags- ja WithSummary-metodeja jäsennellyn OpenAPI-tulosteen luomiseen.
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);
}Valtuutus Minimal API:issa
Suojaamalla päätepisteet RequireAuthorization()-metodilla tai poistamalla suojauksen käytöstä AllowAnonymous()-metodilla voitte hallita käyttöoikeuksia. Käytännöt toimivat samalla tavalla kuin ohjaimissa.
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();Järjestäminen staattisilla metodeilla
Laajemmissa API-rajapinnoissa siirtäkää reittikäsittelijät staattisiin metodeihin tai laajennusmetodeihin, jotta Program.cs pysyy selkeänä ja helposti navigoitavana.
// 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();Täydellinen CRUD-Minimal API
Täydellinen Todo-resurssin CRUD-Minimal API – tiivis, testattava ja tuotantovalmis.
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();
});Pikatarkistus
Miten Minimal API -reittikäsittelijä saa käyttöönsä rekisteröidyn DI-palvelun?
Kertaus: ensimmäisen Minimal API:n luominen
Keskeiset opit:
- MapGet/Post/Put/Delete määrittävät reittikäsittelijät suoraan tiedostossa Program.cs
- Käyttäkää
Results/TypedResults-tyyppejä oikeiden HTTP-tilakoodien palauttamiseen - Reitti-, kysely-, body- ja DI-parametrit sidotaan automaattisesti
- Käyttäkää
RequireAuthorization()- jaAllowAnonymous()-metodeja todennuksen ja valtuutuksen hallintaan - Järjestäkää suuret API:t laajennusmetodeilla tai reittiryhmillä
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”Ensimmäisen Minimal API:n luominen” ilmainen?
Kyllä – oppitunnin ”Ensimmäisen Minimal API:n luominen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Ensimmäisen Minimal API:n luominen”?
Luokaa Minimal API -projekti, määrittäkää reittikäsittelijät ja palauttakaa tyypitettyjä tuloksia mahdollisimman vähäisellä oheiskoodilla. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Ensimmäisen Minimal API:n luominen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Ensimmäisen Minimal API:n luominen
- Reittiryhmät, parametrit ja validointi
- Middleware ja suodattimet Minimal API:ssa
- OpenAPI, versiointi ja käyttöönotto