Episode ini membuka dunia backend dengan ASP.NET Core: dasar Web API, controllers, routing, model binding, dan response formatting, lalu Minimal APIs yang ringkas, serta HTTP client dengan pola resiliency untuk komunikasi antar layanan.

Semua materi sebelumnya berujung di sini: membangun Web API. Episode 11 mengajarkan ASP.NET Core — framework web .NET yang terkenal cepat — mulai dari controllers klasik, routing, model binding, hingga Minimal APIs yang menjadi standar modern.
Di bagian akhir, kalian juga akan memakai HttpClient untuk memanggil API lain dengan pola resiliency seperti retry dan timeout. Kemampuan memanggil sekaligus menyajikan HTTP membuat kalian siap membangun sistem terdistribusi di fase 5.
Buat project dari template webapi:
dotnet new webapi -n Catalog.Api
cd Catalog.Api
dotnet rundotnet new webapi -n Catalog.Api menciptakan project dengan endpoint cuaca contoh. Saat dijalankan, aplikasi memakai Kestrel — web server .NET yang dibangun langsung di atas platform. Akses http://localhost:5xxx untuk melihat respons default.
Template webapi modern memakai Minimal API di Program.cs. File ini berisi registrasi layanan dan definisi endpoint:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/api/health", () => Results.Ok(new { status = "up" }));
app.Run();app.MapGet("/api/health", ...) mendaftarkan endpoint HTTP GET. Results.Ok mengembalikan respons 200 dengan body JSON. Minimal API menempatkan endpoint di tempat yang sama dengan konfigurasi, membuat project kecil tetap ringkas.
Untuk aplikasi besar yang terstruktur per fitur, gunakan controllers:
[ApiController]
[Route("api/produk")]
public class ProdukController : ControllerBase
{
private readonly AppDbContext _db;
public ProdukController(AppDbContext db)
{
_db = db;
}
[HttpGet("{id:int}")]
public async Task<ActionResult<Produk>> GetById(int id)
{
var produk = await _db.Produk.FindAsync(id);
return produk is null ? NotFound() : Ok(produk);
}
}[ApiController] mengaktifkan otomatisasi model binding dan validasi. Route api/produk/{id} memetakan URL ke method, dan constructor injection (episode 8) menghubungkan controller dengan DbContext.
Model binding menerjemahkan body, query, dan route menjadi parameter method:
public record CreateProdukRequest(string Nama, decimal Harga);
[HttpPost]
public async Task<ActionResult<Produk>> Create(CreateProdukRequest request)
{
var produk = new Produk { Nama = request.Nama, Harga = request.Harga };
_db.Produk.Add(produk);
await _db.SaveChangesAsync();
return CreatedAtAction(nameof(GetById), new { id = produk.Id }, produk);
}Body JSON otomatis di-parse menjadi CreateProdukRequest. Respons dikonversi ke JSON dengan JsonSerializerOptions bawaan — misalnya camelCase untuk konsistensi konsumen JavaScript.
Minimal API unggul untuk project kecil dan prototipe; controllers untuk organisasi skala besar. Contoh minimal API yang menangani POST:
app.MapPost("/api/produk", async (CreateProdukRequest req, AppDbContext db) =>
{
var produk = new Produk { Nama = req.Nama, Harga = req.Harga };
db.Produk.Add(produk);
await db.SaveChangesAsync();
return Results.Created($"/api/produk/{produk.Id}", produk);
});Parameter CreateProdukRequest dan AppDbContext disuntikkan otomatis oleh DI. Results.Created mengembalikan 201 dengan Location header. Pendekatan ini menghilangkan boilerplate controller saat endpoint masih sedikit.
Untuk memanggil API lain, daftarkan HttpClient di DI. Gunakan typed client agar konfigurasi tersentralisasi:
builder.Services.AddHttpClient<ICatalogClient, CatalogClient>(client =>
{
client.BaseAddress = new Uri("https://api.example.com");
client.Timeout = TimeSpan.FromSeconds(10);
});AddHttpClient<T> mendaftarkan client bertipe dengan konfigurasi dan lifetime singleton yang aman. BaseAddress dan Timeout ditetapkan sekali; instansiasi koneksi dielola otomatis oleh IHttpClientFactory — menghindari socket exhaustion yang sering terjadi jika memakai new HttpClient() berulang kali.
Sistem terdistribusi rawan kegagalan sesaat. Tambahkan retry dengan Microsoft.Extensions.Http.Resilience:
dotnet add package Microsoft.Extensions.Http.ResilienceKemudian aktifkan retry di registrasi:
builder.Services.AddHttpClient<ICatalogClient, CatalogClient>()
.AddStandardResilienceHandler();.AddStandardResilienceHandler() memberikan retry, timeout, dan circuit breaker dengan pengaturan bawaan yang masuk akal. Dengan ini, layanan kalian tetap sehat meski API hulu sedang mengalami gangguan sesaat.
Tip
Hindari membuat new HttpClient() per request. Selalu gunakan IHttpClientFactory atau typed client dari DI untuk menghindari kebocoran koneksi dan socket exhaustion.
[ApiController] untuk model binding dan validasi otomatis.Results.* menyediakan helper respons HTTP yang jelas.Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membahas security dan identity — autentikasi dan otorisasi ASP.NET Core, JWT bearer tokens, policy-based authorization, integrasi OAuth2 dan OpenID Connect, serta secure headers, CORS, dan data protection.