C# Academy · Oppitunti

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.

Oppitunti 1/413 vaihetta

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 controllers

Tyypitetyt 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()- ja AllowAnonymous()-metodeja todennuksen ja valtuutuksen hallintaan
  • Järjestäkää suuret API:t laajennusmetodeilla tai reittiryhmillä
Aloita maksutta

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

  1. Ensimmäisen Minimal API:n luominen
  2. Reittiryhmät, parametrit ja validointi
  3. Middleware ja suodattimet Minimal API:ssa
  4. OpenAPI, versiointi ja käyttöönotto
← Takaisin: C# Academy