Membuat Minimal API Pertama Anda
Mulai proyek Minimal API, definisikan handler rute, dan kembalikan hasil bertipe dengan kode tambahan seminimal mungkin.
Membuat Minimal API Pertama Anda adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Apa Itu API Minimal
API minimal, yang diperkenalkan di .NET 6, memungkinkan Anda membangun titik akhir HTTP dengan sedikit kode pendukung — tanpa pengontrol dan tanpa atribut tindakan, cukup penangan rute yang ditentukan langsung di Program.cs. API ini ideal untuk layanan mikro dan API ringan.
API Minimal yang Paling Sederhana
API HTTP lengkap hanya dalam beberapa baris. Metode MapGet, MapPost, MapPut, dan MapDelete menentukan penangan rute untuk setiap metode HTTP.
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 controllersHasil Bertipe untuk Respons HTTP yang Tepat
Gunakan Results atau TypedResults untuk kode status HTTP dan jenis konten yang tepat. TypedResults lebih disarankan untuk inferensi skema OpenAPI.
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);
});Parameter Rute & String Kueri
Parameter rute diambil dari jalur URL, parameter string kueri secara otomatis diikat dari kueri, dan isi permintaan dideserialisasi dari 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);
});Injeksi Dependensi pada Penangan Rute
Layanan yang terdaftar dalam kontainer DI dapat disuntikkan langsung sebagai parameter penangan rute. Kerangka kerja akan menyelesaikannya secara otomatis.
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();
});Pengikatan Isi Permintaan
Parameter yang cocok dengan layanan terdaftar akan disuntikkan; parameter lainnya diikat dari isi permintaan (JSON secara bawaan). Gunakan [FromBody] secara eksplisit jika diperlukan.
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);
});Mengembalikan Berbagai Kode Status
Results menyediakan metode pabrik untuk semua respons HTTP umum. Gunakan metode tersebut untuk API REST yang benar secara semantik.
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()Menambahkan Metadata dengan WithName & WithTags
Tambahkan metadata ke titik akhir untuk meningkatkan dokumentasi dan perutean. Gunakan WithName, WithTags, dan WithSummary untuk keluaran OpenAPI yang teratur.
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);
}Otorisasi dalam API Minimal
Terapkan RequireAuthorization() untuk melindungi titik akhir, atau gunakan AllowAnonymous() untuk mengecualikannya. Kebijakan berfungsi sama seperti pada pengontrol.
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();Menata dengan Metode Statis
Untuk API yang lebih besar, pindahkan penangan rute ke metode statis atau metode ekstensi agar Program.cs tetap bersih dan mudah dinavigasi.
// 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();Contoh Dunia Nyata: API Minimal CRUD Lengkap
API Minimal CRUD lengkap untuk sumber daya tugas—ringkas, dapat diuji, dan siap produksi.
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();
});Pemeriksaan Singkat
Bagaimana penangan rute API Minimal menerima layanan DI yang telah didaftarkan?
Ringkasan: Membuat API Minimal Pertama Anda
Hal-hal penting:
- MapGet/Post/Put/Delete menentukan penangan rute langsung di Program.cs
- Gunakan
Results/TypedResultsuntuk kode status HTTP yang tepat - Parameter rute, kueri, isi, dan DI semuanya diikat secara otomatis
- Gunakan
RequireAuthorization()danAllowAnonymous()untuk autentikasi - Atur API besar dengan metode ekstensi atau grup rute
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membuat Minimal API Pertama Anda” gratis?
Ya — teks lengkap “Membuat Minimal API Pertama Anda” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Membuat Minimal API Pertama Anda”?
Mulai proyek Minimal API, definisikan handler rute, dan kembalikan hasil bertipe dengan kode tambahan seminimal mungkin. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Membuat Minimal API Pertama Anda” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat Minimal API Pertama Anda
- Grup Rute, Parameter & Validasi
- Middleware & Filter dalam Minimal API
- OpenAPI, Pemberian Versi & Deployment