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
HttpClientuntuk sekelompok permintaan dan buang denganusingsetelah selesai; kelas ini murah untuk dipakai ulang karena menyimpan pengaturan seperti timeout. - Panggil
GetAsync(url)untuk permintaan GET; hasilnyaHttpResponseMessageyang membawa status dan isi. - Baca isi dengan
ReadAsStringAsync()pada propertiContent. - Bungkus panggilan dengan
try/catchuntukHttpRequestException, karena kegagalan jaringan dilempar saatawait.
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:
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:
Status: 200 OK
Judul halaman: Example DomainMari kita bedah baris-barisnya:
using HttpClient client = new(): satu instance dibuat dan dibuang otomatis; propertiTimeoutdijadwalkan 20 detik untuk seluruh permintaan.await client.GetAsync(...): permintaan dikirim; thread dibebaskan selama jaringan bekerja danawaitkembali denganHttpResponseMessage.await respons.Content.ReadAsStringAsync(): isi respons dibaca sebagai string secara asinkron, melanjutkan rantaiawaityang sama.isi[mulai..akhir]: rentang karakter antara tag<title>dan</title>diambil untuk menampilkan judul dokumen.catch (HttpRequestException): bila jaringan gagal, exception terlempar di titikawait, bukan di baris pembuatan client.
Panggilan jaringan sudah asinkron. Bab berikutnya menjawab pertanyaan penting: setelah await, eksekusi kembali ke thread mana?