Belajar C# - Web API & HTTP Client
Series/Belajar C#/Episode 11
Episode 11 of 23

Belajar C# - Web API & HTTP Client

Episode ini membangun Web API dengan ASP.NET Core: struktur project Web API, controller dengan routing dan model binding, response formatting, penggunaan HttpClient dan typed clients untuk konsumsi API, serta API versioning dan standard error response.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Backend modern hampir selalu berbentuk API — antarmuka yang melayani permintaan dari aplikasi web, mobile, atau layanan lain. ASP.NET Core adalah framework web utama .NET, dikenal dengan performa tinggi dan tooling yang lengkap.

Tapi API yang baik bukan hanya soal mengembalikan JSON. Dia harus punya routing yang konsisten, model binding yang aman, response yang terstruktur, dan dukungan terhadap perubahan versi.

Episode 11 ini membangun Web API dari nol: struktur project, controller dan routing, model binding, HttpClient untuk mengonsumsi API lain, serta API versioning dan error response yang standar.

Dasar ASP.NET Core Web API

Membuat Project Web API

Template Web API menyediakan struktur lengkap dengan OpenAPI dan minimal setup:

Membuat project Web API
dotnet new webapi -n Toko.Api -o src/Toko.Api
dotnet add src/Toko.Api package Microsoft.EntityFrameworkCore.Sqlite

Perintah dotnet new webapi -n Toko.Api menciptakan project dengan file Program.cs yang sudah berisi pipeline minimal. Untuk project baru, ASP.NET Core menganjurkan pendekatan minimal APIs, sementara project besar sering memakai controller.

Controller, Routing, dan Model Binding

Membuat Controller Pertama

Controller adalah class yang menangani permintaan HTTP dan mengembalikan response:

Controller dengan routing
[ApiController]
[Route("api/produk")]
public class ProdukController : ControllerBase
{
    private static readonly List<Produk> Produk = new()
    {
        new Produk { Id = 1, Nama = "Kopi Gayo", Harga = 85_000m }
    };
 
    [HttpGet("{id:int}")]
    public ActionResult<Produk> GetProduk(int id)
    {
        var hasil = Produk.FirstOrDefault(p => p.Id == id);
        if (hasil is null)
        {
            return NotFound();
        }
        return Ok(hasil);
    }
 
    [HttpPost]
    public ActionResult<Produk> BuatProduk([FromBody] Produk produk)
    {
        produk.Id = Produk.Count + 1;
        Produk.Add(produk);
        return CreatedAtAction(nameof(GetProduk), new { id = produk.Id }, produk);
    }
}

[Route("api/produk")] menentukan base path controller. Model binding mengisi parameter int id dari route, dan [FromBody] Produk memetakan JSON di body request ke object C#. Attribute [ApiController] mengaktifkan validasi model otomatis — request yang tidak valid ditolak sebelum masuk ke method.

Response Formatting

Content negotiation bawaan membuat API mengembalikan JSON secara default. Untuk memaksa format, gunakan properti Accept di request, atau definisikan format via Produces:

Mengatur format response
[HttpGet("{id:int}")]
[Produces("application/json")]
public ActionResult<Produk> GetProdukJson(int id) => Ok(Produk.First(p => p.Id == id));

Response helper seperti Ok, NotFound, dan CreatedAtAction menghasilkan status code HTTP yang tepat beserta body JSON — inilah dasar desain RESTful yang konsisten.

HTTP Client dan Typed Clients

HttpClient Dasar

Aplikasi backend sering memanggil API lain. HttpClient adalah klien HTTP utama .NET:

Memanggil API lain
using var client = new HttpClient();
client.BaseAddress = new Uri("https://api.exchangerate.host");
 
var response = await client.GetAsync("/v1/latest?base=USD");
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

Peringatan penting: jangan pernah membuat HttpClient baru untuk setiap request — socket akan bocor dan koneksi menumpuk. Solusinya adalah typed clients yang didaftarkan di DI.

Typed Client dengan IHttpClientFactory

Typed client mengabstraksi semua detail HTTP ke dalam satu class yang bisa di-inject:

Typed client terdaftar di DI
class ExchangeRateClient
{
    private readonly HttpClient _http;
    public ExchangeRateClient(HttpClient http) => _http = http;
 
    public async Task<string> GetRatesAsync()
    {
        return await _http.GetStringAsync("/v1/latest?base=USD");
    }
}
 
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient<ExchangeRateClient>(c =>
    c.BaseAddress = new Uri("https://api.exchangerate.host"));

AddHttpClient<ExchangeRateClient> mendaftarkan klien dengan HttpClient yang dikelola dan diputar oleh factory — connection pooling, timeout, dan retry ditangani otomatis.

API Versioning dan Standard Error Response

Versioning dengan Package

Saat API berevolusi, klien lama tidak boleh rusak. Versioning memungkinkan beberapa versi endpoint hidup berdampingan:

Menambah package versioning
dotnet add src/Toko.Api package Asp.Versioning.Mvc
Controller ber-versi
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/produk")]
public class ProdukController : ControllerBase
{
    [HttpGet]
    public IActionResult Get() => Ok(new[] { "versi 1" });
}

Dengan pola di atas, /api/v1/produk dan versi berikutnya bisa berjalan berdampingan tanpa konflik. Error response yang standar mengikuti format ProblemDetails bawaan ASP.NET Core:

Format error ProblemDetails
{
  "type": "https://tools.ietf.org/html/rfc9110",
  "title": "Not Found",
  "status": 404,
  "detail": "Produk dengan id tersebut tidak ditemukan."
}

Format ini sudah distandardisasi dan bisa langsung dipakai klien untuk menampilkan pesan error.

Penutup

Inti yang harus dibawa pulang:

  • [ApiController] mengaktifkan validasi model otomatis.
  • Routing, model binding, dan response helper membentuk desain REST yang konsisten.
  • Selalu daftarkan HttpClient lewat factory dengan typed clients.
  • API versioning menjaga klien lama tetap berfungsi saat API berubah.
  • Error response standar memakai format ProblemDetails.

Di episode 12 selanjutnya kita mengamankan API: security dan identity — ASP.NET Core Identity, pipeline authentication, JWT authentication, authorization policies, OAuth2 dan OpenID Connect, serta secure headers, CORS, dan token management.

Belajar C# - Web API & HTTP Client | Belajar C#