Panggilan HTTP adalah pekerjaan menunggu yang paling sering ditemui: waktu tempuh jaringan berkisar dari puluhan hingga ribuan milidetik, dan memblokir thread selama itu adalah pemborosan terbesar dalam aplikasi terdistribusi. Kelas HttpClient didesain asinkron sejak awal; seluruh operasinya mengembalikan Task, sehingga pemanggil bebas sampai respons tiba. Bab ini mencontohkan pola dasar permintaan GET dengan penanganan kegagalan jaringan.

Pola Dasar HttpClient #

  • Buat satu HttpClient untuk sekelompok permintaan dan buang dengan using setelah selesai; kelas ini murah untuk dipakai ulang karena menyimpan pengaturan seperti timeout.
  • Panggil GetAsync(url) untuk permintaan GET; hasilnya HttpResponseMessage yang membawa status dan isi.
  • Baca isi dengan ReadAsStringAsync() pada properti Content.
  • Bungkus panggilan dengan try/catch untuk HttpRequestException, karena kegagalan jaringan dilempar saat await.

Untuk aplikasi besar, pemanggilan HttpClient sebaiknya dikelola lewat IHttpClientFactory; detail pengelolaannya keluar dari lingkup bab ini.

Contoh: Mengambil Halaman example.com #

Kode berikut meminta halaman example.com, mencetak statusnya, lalu mengambil judul dokumen:

csharp
using HttpClient client = new();
client.Timeout = TimeSpan.FromSeconds(20);

try
{
    HttpResponseMessage respons = await client.GetAsync("https://example.com");
    string isi = await respons.Content.ReadAsStringAsync();

    Console.WriteLine($"Status: {(int)respons.StatusCode} {respons.StatusCode}");

    int mulai = isi.IndexOf("<title>") + 7;
    int akhir = isi.IndexOf("</title>");
    Console.WriteLine($"Judul halaman: {isi[mulai..akhir]}");
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"Permintaan gagal: {ex.Message}");
}

Output yang Dihasilkan:

text
Status: 200 OK
Judul halaman: Example Domain

Mari kita bedah baris-barisnya:

  1. using HttpClient client = new(): satu instance dibuat dan dibuang otomatis; properti Timeout dijadwalkan 20 detik untuk seluruh permintaan.
  2. await client.GetAsync(...): permintaan dikirim; thread dibebaskan selama jaringan bekerja dan await kembali dengan HttpResponseMessage.
  3. await respons.Content.ReadAsStringAsync(): isi respons dibaca sebagai string secara asinkron, melanjutkan rantai await yang sama.
  4. isi[mulai..akhir]: rentang karakter antara tag <title> dan </title> diambil untuk menampilkan judul dokumen.
  5. catch (HttpRequestException): bila jaringan gagal, exception terlempar di titik await, bukan di baris pembuatan client.

Panggilan jaringan sudah asinkron. Bab berikutnya menjawab pertanyaan penting: setelah await, eksekusi kembali ke thread mana?