Ktor: apa itu, fitur klien HTTP asinkron

Penulis: IT Sectr Diterbitkan: 2026-03-07 Waktu membaca: 8 mnt

Ktor adalah klien HTTP asinkron untuk Kotlin, dikembangkan oleh JetBrains sebagai bagian dari framework dengan nama yang sama untuk pengembangan sisi server dan klien. Ktor dibangun di atas coroutine Kotlin dan mendukung multi-platform. Menurut data JetBrains, 2025, Ktor menyediakan integrasi asli dengan ekosistem Kotlin tanpa refleksi dan dependensi tambahan.

Poin Utama

  • Ktor — klien HTTP asinkron di Kotlin dengan dukungan multi-platform
  • Coroutine — dasar eksekusi permintaan tanpa callback dan aliran reaktif
  • Plugin — sistem ekstensi modular untuk serialisasi, logging, dan otorisasi
  • Multi-platform — satu kode untuk Android, iOS, Desktop, dan Server
  • Kotlinx Serialization — serialisasi asli tanpa refleksi melalui @Serializable

Apa itu Ktor?

Ktor adalah framework untuk membangun aplikasi asinkron sisi server dan klien di Kotlin, dibuat oleh JetBrains. Ktor Client — bagian klien dari framework, yang menyediakan klien HTTP dengan dukungan penuh untuk coroutine Kotlin, multi-platform (JVM, Native, JS) dan arsitektur modular berbasis plugin.

Ktor muncul pada tahun 2018 sebagai alternatif untuk Retrofit dan OkHttp untuk proyek Kotlin-first. Tidak seperti Retrofit yang menggunakan pendekatan Java dengan anotasi, Ktor Client menggunakan Kotlin DSL untuk konfigurasi permintaan — tanpa anotasi dan refleksi. Ini membuat kode lebih mudah dibaca dan type-safe bagi pengembang Kotlin.

Menurut survei Kotlin Multiplatform 2024, Ktor Client digunakan di 35% proyek Kotlin Multiplatform Mobile (KMM), menjadikannya klien HTTP terpopuler kedua setelah OkHttp di komunitas Kotlin. Ktor lebih disukai dalam proyek di mana multi-platform dan integrasi asli dengan ekosistem Kotlin penting.

Bagaimana Ktor Client Bekerja

Arsitektur Ktor Client didasarkan pada pipeline plugin. Setiap permintaan melewati urutan plugin yang terinstal, yang dapat memodifikasi permintaan, respons, atau melakukan tindakan sampingan — logging, kompresi, serialisasi, autentikasi.

Saat membuat klien HTTP melalui blok HttpClient { } DSL, Anda menentukan engine (OkHttp, Android, CIO, Darwin) dan menginstal plugin. Setiap engine mengimplementasikan pengiriman permintaan tingkat rendah untuk platform tertentu: di Android menggunakan engine OkHttp, di iOS — Darwin (URLSession), di Desktop — CIO (Coroutine-based I/O). HttpClient secara otomatis memilih engine optimal untuk platform saat ini.

Permintaan di Ktor Client dieksekusi melalui fungsi suspend, yang berarti integrasi penuh dengan coroutine. Tidak ada Callback, RxJava, atau LiveData — hanya kode sekuensial dengan suspend yang bekerja asinkron tanpa memblokir thread.

Pipeline pemrosesan permintaan

Pipeline Ktor terdiri dari fase: pertama permintaan melewati plugin yang terinstal (misalnya, ContentNegotiation untuk JSON, Logging untuk log), kemudian engine mengeksekusi permintaan HTTP, dan respons kembali melewati plugin untuk deserialisasi. Setiap plugin adalah fungsi suspend yang dieksekusi dalam coroutine pipeline.

Keuntungan penting dari pipeline Ktor adalah kemungkinan pemrosesan bersyarat. Plugin dapat memeriksa URL atau header permintaan dan melewati pemrosesan jika kondisi tidak terpenuhi. Misalnya, ContentEncoding dengan gzip hanya diterapkan pada respons yang mengandung header Content-Encoding: gzip, dan Auth hanya berfungsi untuk endpoint yang dilindungi tanpa memengaruhi API publik.

Pendekatan pipeline ini memungkinkan kombinasi plugin yang fleksibel: Anda dapat menginstal ContentNegotiation dengan JSON, menambahkan Auth dengan token Bearer, mengaktifkan kompresi ContentEncoding dan HttpTimeout — dan semuanya akan bekerja bersama dalam urutan yang benar. Urutan instalasi plugin penting: yang pertama diinstal akan memproses permintaan lebih awal dari yang lain.

Plugin Ktor Client

Plugin — sistem ekstensi modular Ktor, yang menggantikan anotasi Retrofit dan interceptor OkHttp. Setiap plugin menyelesaikan tugas tertentu dan diinstal melalui fungsi install() di blok HttpClient. Ktor menyediakan plugin bawaan, dan juga memungkinkan pembuatan plugin kustom.

PluginTujuan
ContentNegotiationSerialisasi dan deserialisasi JSON, XML melalui Kotlinx Serialization
LoggingLogging permintaan dan respons dengan konfigurasi level
AuthAutentikasi: Basic, Bearer, Digest dengan pembaruan token otomatis
HttpTimeoutKonfigurasi batas waktu koneksi, pembacaan, dan permintaan
ContentEncodingKompresi transparan gzip dan deflate
DefaultRequestPengaturan nilai default untuk semua permintaan

Plugin kustom

Untuk tugas spesifik, dibuat plugin kustom melalui createClientPlugin. Plugin dapat mengintersep permintaan (onRequest), respons (onResponse), atau menangani kesalahan (onError). Ini sepenuhnya menggantikan Interceptor dari OkHttp, tetapi dengan API Kotlin yang diketik dan dukungan fungsi suspend.

Plugin kustom berguna untuk menambahkan metrik, logika pengulangan otomatis, pelacakan permintaan, atau pengujian A/B endpoint. Tidak seperti interceptor OkHttp, plugin Ktor ditulis dalam Kotlin dan bekerja dalam konteks coroutine, yang menyederhanakan penanganan kesalahan dan batas waktu.

Untuk debugging permintaan, digunakan plugin Logging dengan level ALL, HEADERS, atau BODY. Logging menampilkan metode, URL, status, header, dan body permintaan serta respons. Tidak seperti HttpLoggingInterceptor dari OkHttp, Ktor Logging bekerja asinkron dan dapat dikonfigurasi untuk memfilter berdasarkan level log (ERROR, WARN, INFO, DEBUG) tanpa menghentikan aplikasi untuk mengubah konfigurasi.

Contoh Kode Ktor Client di Kotlin

Mari kita lihat permintaan GET dasar melalui Ktor Client. HttpClient dibuat dengan plugin ContentNegotiation terinstal untuk JSON. Permintaan dieksekusi melalui fungsi suspend get(), hasilnya secara otomatis dideserialisasi menjadi data class.

kotlin
data class User(
    val login: String,
    val id: Int,
    val avatarUrl: String
)

val client = HttpClient {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
        })
    }
}

suspend fun getUser(): User {
    return client.get("https://api.github.com/users/octocat").body()
}

Untuk permintaan POST dengan body digunakan fungsi post() dengan contentType() dan body(). Ktor secara otomatis menserialisasi objek ke JSON melalui ContentNegotiation yang terinstal. Gaya DSL membuat kode sekuensial dan mudah dibaca.

kotlin
data class CreateRepo(
    val name: String,
    val description: String,
    val private: Boolean
)

suspend fun createRepo(): Unit {
    val repo = CreateRepo(
        name = "my-project",
        description = "Sample project",
        private = false
    )
    client.post("https://api.github.com/user/repos") {
        contentType(ContentType.Application.Json)
        setBody(repo)
    }
}

Konfigurasi batas waktu dan header

HttpTimeout dan DefaultRequest — dua plugin kunci untuk konfigurasi. HttpTimeout menetapkan batas waktu, dan DefaultRequest menentukan header dan parameter URL untuk semua permintaan, menghilangkan duplikasi kode di setiap panggilan.

kotlin
val client = HttpClient {
    install(HttpTimeout) {
        connectTimeoutMillis = 15000
        requestTimeoutMillis = 30000
    }
    install(DefaultRequest) {
        url("https://api.github.com/")
        header("Accept", "application/json")
    }
}

Dukungan Multi-platform Ktor

Multi-platform — keunggulan utama Ktor dibandingkan OkHttp dan Retrofit. Ktor Client bekerja di JVM (Android, Server), Native (iOS, macOS, Windows, Linux) dan JS (Browser). Kode klien HTTP yang sama berjalan di semua platform tanpa perubahan, yang sangat berharga untuk proyek Kotlin Multiplatform.

Untuk setiap platform, Ktor menggunakan engine-nya sendiri. Di Android, secara default diterapkan engine OkHttp, yang memberikan kompatibilitas penuh dengan ekosistem OkHttp. Di iOS menggunakan DarwinEngine berbasis URLSession. Untuk Server — CIOEngine (Coroutine I/O). Engine dapat ditentukan secara eksplisit: HttpClient(OkHttp) { } atau HttpClient(Darwin) { }.

Saat memilih engine, pertimbangkan kemampuannya: engine OkHttp mendukung HTTP/2 dan kumpulan koneksi, DarwinEngine — integrasi asli dengan jaringan iOS dan sesi latar belakang URLSession, CIOEngine — implementasi coroutine murni tanpa dependensi eksternal. Untuk target Web digunakan JsEngine atau BrowserEngine yang bekerja melalui fetch API.

Berkat API yang seragam di semua platform, kode untuk memuat data terlihat sama di Android, iOS, dan Desktop. Ini mengurangi duplikasi kode sebesar 60–80% di proyek KMM dibandingkan dengan implementasi terpisah di Retrofit (Android) dan URLSession (iOS). Plugin juga bekerja di semua platform tanpa perubahan.

Kesalahan Umum saat Bekerja dengan Ktor

Mengabaikan penutupan HttpClient — kesalahan umum di Ktor. HttpClient mengimplementasikan Closeable dan harus ditutup saat aplikasi berakhir melalui client.close(). Di Android, ini dilakukan di onDestroy() Activity atau ViewModel.onCleared(). Klien yang tidak ditutup menyebabkan kebocoran coroutine dan thread engine.

Urutan plugin yang salah dapat merusak pemrosesan permintaan. Misalnya, ContentNegotiation harus diinstal sebelum DefaultRequest agar tipe konten diterapkan dengan benar. Logging disarankan diinstal terakhir untuk mencatat versi final permintaan setelah semua modifikasi. Eksperimen dengan urutan jika plugin berperilaku tidak terduga.

Tidak adanya penanganan pengecualian dalam fungsi suspend. Ktor melempar IOException pada kesalahan jaringan dan ClientRequestException pada status HTTP 4xx. Blok try-catch wajib untuk setiap panggilan get(), post(), dan metode lainnya. Gunakan HttpResponseValidator di blok HttpClient untuk penanganan kesalahan global tanpa duplikasi try-catch di setiap metode.

Pertanyaan yang Sering Diajukan

Apa perbedaan Ktor dengan Retrofit?

Ktor menggunakan Kotlin DSL dan plugin tanpa anotasi dan refleksi. Retrofit dibangun di atas anotasi Java dan refleksi. Ktor mendukung multi-platform, Retrofit — hanya JVM/Android. Ktor bekerja secara asli dengan coroutine, Retrofit menambahkan suspend melalui pembungkus.

Engine Ktor mana yang terbaik untuk Android?

Untuk Android, engine OkHttp optimal — memberikan kompatibilitas dengan ekosistem OkHttp, kumpulan koneksi, caching, dan HTTP/2. Pilih melalui HttpClient(OkHttp) { }. Alternatif — CIOEngine bawaan Ktor, tetapi kurang stabil di Android.

Apakah Ktor mendukung HTTP/2?

Ya, Ktor mendukung HTTP/2 melalui engine yang sesuai. Engine OkHttp mewarisi dukungan HTTP/2 dari OkHttp. DarwinEngine di iOS mendukung HTTP/2 melalui URLSession. CIOEngine mendukung HTTP/2 di sisi server. Pilihan engine menentukan tingkat dukungan protokol.

Bagaimana cara mengonfigurasi otorisasi di Ktor Client?

Gunakan plugin Auth dengan pengaturan bearer { }. Plugin secara otomatis menambahkan header Authorization ke setiap permintaan dan dapat memperbarui token pada respons 401 melalui refreshTokens. Contoh: install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }.

Bisakah Ktor Client digunakan di iOS?

Ya, Ktor Client berfungsi penuh di iOS melalui DarwinEngine, yang menggunakan URLSession. Semua plugin, serialisasi, dan coroutine bekerja di iOS sama seperti di Android. Ini menjadikan Ktor sebagai klien HTTP utama untuk proyek Kotlin Multiplatform Mobile (KMM).

Kesimpulan

  • Ktor — klien HTTP asinkron dari JetBrains dengan dukungan multi-platform
  • Kotlin DSL menggantikan anotasi — konfigurasi melalui blok program tanpa refleksi
  • Plugin ContentNegotiation, Auth, Logging, dan HttpTimeout memperluas fungsionalitas secara modular
  • Coroutine — dasar eksekusi: semua metode suspend tanpa callback dan aliran reaktif
  • Multi-platform — satu kode untuk Android, iOS, Desktop, Server, dan JS
  • Engine OkHttp, Darwin, CIO menyesuaikan Ktor dengan platform tertentu
  • HttpResponseValidator memusatkan penanganan kesalahan HTTP tanpa duplikasi try-catch

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga