Ktor — bu JetBrains kompaniyasi tomonidan server va mijoz tomonida ishlab chiqish uchun bir nomli freymvorkning bir qismi sifatida ishlab chiqilgan Kotlin uchun asinxron HTTP-mijoz. Ktor Kotlin korutinlari asosida qurilgan va ko'p platformalilikni qo'llab-quvvatlaydi. JetBrains, 2025 ma'lumotlariga ko'ra, Ktor Kotlin ekotizimi bilan reflektsiya va qo'shimcha bog'liqliklarsiz mahalliy integratsiyani ta'minlaydi.
Asosiy
Ktor — Kotlin tilida asinxron server va mijoz ilovalarini qurish uchun JetBrains tomonidan yaratilgan freymvork. Ktor Client — freymvorkning mijoz qismi bo'lib, Kotlin korutinlari, ko'p platformalilik (JVM, Native, JS) va plaginlarga asoslangan modul arxitektura bilan to'liq HTTP-mijozni taqdim etadi.
Ktor 2018-yilda Kotlin-first loyihalari uchun Retrofit va OkHttp-ga alternativa sifatida paydo bo'ldi. Annotatsiyalar bilan Java yondashuvini olgan Retrofitdan farqli o'laroq, Ktor Client so'rovlarni sozlash uchun Kotlin DSL dan foydalanadi — annotatsiyalar va reflektisyasiz. Bu kodni Kotlin dasturchilari uchun yanada o'qiladigan va tip-xavfsiz qiladi.
Kotlin Multiplatform 2024 so'roviga ko'ra, Ktor Client Kotlin Multiplatform Mobile (KMM) loyihalarining 35 foizida qo'llaniladi va bu uni Kotlin hamjamiyatida OkHttp-dan keyin ikkinchi eng ommabop HTTP-mijozga aylantiradi. Ktor ko'p platformalilik va Kotlin ekotizimi bilan mahalliy integratsiya muhim bo'lgan loyihalarda afzal ko'riladi.
Ktor Client arxitekturasi plaginlarning quvur liniyasiga (pipeline) asoslangan. Har bir so'rov o'rnatilgan plaginlar ketma-ketligidan o'tadi, ular so'rovni, javobni o'zgartirishi yoki qo'shimcha harakatlarni bajarishi mumkin — jurnallashtirish, siqish, serializatsiya, autentifikatsiya.
HttpClient { } DSL bloki orqali HTTP-mijozni yaratishda siz dvigatelni (OkHttp, Android, CIO, Darwin) belgilaysiz va plaginlarni o'rnatasiz. Har bir dvigatel ma'lum bir platforma uchun so'rovni past darajada jo'natishni amalga oshiradi: Android-da OkHttp dvigateli, iOS-da — Darwin (URLSession), Desktop-da — CIO (Coroutine-based I/O). HttpClient joriy platforma uchun optimal dvigatelni avtomatik tanlaydi.
Ktor Client-dagi so'rov suspend-funksiya orqali bajariladi, bu korutinlar bilan to'liq integratsiyani anglatadi. Hech qanday Callback, RxJava yoki LiveData — faqat ipni bloklamasdan asinxron ishlaydigan suspend bilan ketma-ket kod.
Ktor quvur liniyasi fazalardan iborat: avval so'rov o'rnatilgan plaginlardan o'tadi (masalan, JSON uchun ContentNegotiation, jurnallar uchun Logging), keyin dvigatel HTTP so'rovini bajaradi va javob deserializatsiya uchun yana plaginlardan o'tadi. Har bir plugin — quvur liniyasi korutinida bajariladigan suspend-funksiya.
Ktor quvur liniyasining muhim afzalligi — shartli qayta ishlash imkoniyati. Plugin so'rovning URL yoki sarlavhalarini tekshirishi va shart bajarilmasa, qayta ishlashni o'tkazib yuborishi mumkin. Masalan, gzip bilan ContentEncoding faqat Content-Encoding: gzip sarlavhasini o'z ichiga olgan javoblarga qo'llaniladi, Auth esa faqat himoyalangan endpoinlar uchun ishlaydi, umumiy API-larga ta'sir qilmaydi.
Bunday quvur liniyasi yondashuvi plaginlarni moslashuvchan birlashtirishga imkon beradi: siz JSON bilan ContentNegotiation o'rnatishingiz, Bearer token bilan Auth qo'shishingiz, ContentEncoding siqish va HttpTimeout-ni yoqishingiz mumkin — va ularning barchasi to'g'ri tartibda birgalikda ishlaydi. Plaginlarni o'rnatish tartibi muhim: birinchi o'rnatilgan so'rovni qolganlardan oldin qayta ishlaydi.
Plaginlar — Retrofit annotatsiyalari va OkHttp interceptorslarini almashtiradigan Ktor-ning modul kengaytma tizimi. Har bir plugin aniq vazifani hal qiladi va HttpClient blokida install() funksiyasi orqali o'rnatiladi. Ktor o'rnatilgan plaginlarni taqdim etadi, shuningdek, maxsus plaginlar yaratishga imkon beradi.
| Plugin | Vazifasi |
|---|---|
| ContentNegotiation | Kotlinx Serialization orqali JSON, XML serializatsiyasi va deserializatsiyasi |
| Logging | Daraja sozlamasi bilan so'rov va javoblarni jurnallashtirish |
| Auth | Avtomatik tokenni yangilash bilan Basic, Bearer, Digest autentifikatsiyasi |
| HttpTimeout | Ulanish, o'qish va so'rov vaqt chegaralarini sozlash |
| ContentEncoding | Shaffof gzip va deflate siqish |
| DefaultRequest | Barcha so'rovlar uchun standart qiymatlarni o'rnatish |
Maxsus vazifalar uchun createClientPlugin orqali plugin yaratiladi. Plugin so'rovni (onRequest), javobni (onResponse) intercept qilishi yoki xatolarni (onError) boshqarishi mumkin. Bu OkHttp-dagi Interceptorni to'liq almashtiradi, lekin tipli Kotlin-API va suspend-funksiyalar qo'llab-quvvatlashi bilan.
Maxsus plaginlar metrikalar, avtomatik qayta urinish mantig'i, so'rovlarni kuzatish yoki endpoinlarning A/B testini qo'shish uchun qulay. OkHttp interceptorlaridan farqli o'laroq, Ktor plaginlari Kotlin tilida yozilgan va korutin kontekstida ishlaydi, bu xato va vaqt chegaralarini boshqarishni soddalashtiradi.
So'rovlarni tuzatish uchun ALL, HEADERS yoki BODY darajasi bilan Logging pluginidan foydalaniladi. Logging metod, URL, status, sarlavhalar va so'rov/javob tanasini ko'rsatadi. OkHttp-dagi HttpLoggingInterceptor-dan farqli o'laroq, Ktor Logging asinxron ishlaydi va konfiguratsiyani o'zgartirish uchun ilovani to'xtatmasdan jurnal darajasi (ERROR, WARN, INFO, DEBUG) bo'yicha filtrlashga sozlanishi mumkin.
Asosiy GET so'rovini Ktor Client orqali ko'rib chiqamiz. JSON uchun o'rnatilgan ContentNegotiation plugin bilan HttpClient yaratiladi. So'rov suspend get() funksiyasi orqali bajariladi, natija avtomatik ravishda data class-ga deserializatsiya qilinadi.
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()
}
Tanali POST so'rovi uchun contentType() va body() bilan post() funksiyasi ishlatiladi. Ktor o'rnatilgan ContentNegotiation orqali obyektni avtomatik JSON-ga serializatsiya qiladi. DSL uslubi kodni ketma-ket va o'qiladigan qiladi.
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)
}
}
HttpTimeout va DefaultRequest — sozlash uchun ikkita asosiy plagin. HttpTimeout vaqt chegaralarini belgilaydi, DefaultRequest esa barcha so'rovlar uchun sarlavhalar va URL parametrlarini belgilab, har bir chaqiruvda kod takrorlanishining oldini oladi.
val client = HttpClient {
install(HttpTimeout) {
connectTimeoutMillis = 15000
requestTimeoutMillis = 30000
}
install(DefaultRequest) {
url("https://api.github.com/")
header("Accept", "application/json")
}
}
Ko'p platformalilik — Ktor-ning OkHttp va Retrofitga nisbatan asosiy ustunligi. Ktor Client JVM (Android, Server), Native (iOS, macOS, Windows, Linux) va JS (Browser) da ishlaydi. HTTP-mijozning bir xil kodi barcha platformalarda o'zgarishsiz ishlaydi, bu ayniqsa Kotlin Multiplatform loyihalari uchun qimmatlidir.
Har bir platforma uchun Ktor o'z dvigatelidan (engine) foydalanadi. Android-da sukut bo'yicha OkHttp dvigateli qo'llaniladi, OkHttp ekotizimi bilan to'liq moslikni ta'minlaydi. iOS-da URLSession-ga asoslangan DarwinEngine ishlatiladi. Server uchun — CIOEngine (Coroutine I/O). Dvigatel aniq ko'rsatilishi mumkin: HttpClient(OkHttp) { } yoki HttpClient(Darwin) { }.
Dvigatelni tanlashda uning imkoniyatlarini hisobga oling: OkHttp dvigateli HTTP/2 va ulanishlar hovuzini qo'llab-quvvatlaydi, DarwinEngine — iOS tarmog'i bilan mahalliy integratsiya va URLSession fon sessiyalari, CIOEngine — tashqi bog'liqliklarsiz sof korutin tatbiqi. Web maqsadlari uchun fetch API orqali ishlaydigan JsEngine yoki BrowserEngine ishlatiladi.
Barcha platformalarda yagona API tufayli ma'lumot yuklash kodi Android, iOS va Desktop-da bir xil ko'rinadi. Bu KMM loyihalarida Retrofit (Android) va URLSession (iOS) bo'yicha alohida tatbiqlar bilan solishtirganda kod takrorlanishini 60–80% ga kamaytiradi. Plaginlar ham barcha platformalarda o'zgarishsiz ishlaydi.
HttpClient-ni yopishni e'tiborsiz qoldirish — Ktor-da keng tarqalgan xato. HttpClient Closeable interfeysini amalga oshiradi va ilova tugagach client.close() orqali yopilishi kerak. Android-da bu onDestroy() Activity yoki ViewModel.onCleared() da amalga oshiriladi. Yopilmagan mijoz korutin va dvigatel oqimlarining sizib chiqishiga olib keladi.
Plaginlarning noto'g'ri tartibi so'rovni qayta ishlashni buzishi mumkin. Masalan, ContentNegotiation DefaultRequest-dan oldin o'rnatilishi kerak, shunda kontent turi to'g'ri qo'llaniladi. Logging-ni oxirgi o'rnatish tavsiya etiladi, shunda barcha o'zgarishlardan keyin so'rovning yakuniy versiyasi jurnallashtiriladi. Plaginlar kutilmagan harakat qilsa, tartib bilan tajriba qiling.
suspend-funksiyalarda istisnolarni boshqarmaslik. Ktor tarmoq xatolarida IOException va HTTP 4xx statuslarida ClientRequestException chiqaradi. Har bir get(), post() va boshqa metod chaqiruvi uchun try-catch bloki majburiydir. Har bir metodda try-catch takrorlanmasligi uchun HttpClient blokida HttpResponseValidator-dan foydalaning.
Tez-tez beriladigan savollar
Ktor annotatsiyalar va reflektisyasiz Kotlin DSL va plaginlardan foydalanadi. Retrofit Java annotatsiyalari va reflektisiya asosida qurilgan. Ktor ko'p platformalilikni qo'llab-quvvatlaydi, Retrofit — faqat JVM/Android. Ktor korutinlar bilan mahalliy ishlaydi, Retrofit suspendni o'rovchi orqali qo'shgan.
Android uchun OkHttp dvigateli optimal — OkHttp ekotizimi bilan moslik, ulanishlar hovuzi, keshlash va HTTP/2 ni ta'minlaydi. Uni HttpClient(OkHttp) { } orqali tanlang. Muqobil — Ktor-ga o'rnatilgan CIOEngine, lekin Android-da kamroq barqaror.
Ha, Ktor tegishli dvigatel orqali HTTP/2 ni qo'llab-quvvatlaydi. OkHttp dvigateli HTTP/2 qo'llab-quvvatlashni OkHttp-dan meros qilib oladi. iOS-da DarwinEngine URLSession orqali HTTP/2 ni qo'llab-quvvatlaydi. CIOEngine server tomonida HTTP/2 ni qo'llab-quvvatlaydi. Dvigatel tanlovi protokolni qo'llab-quvvatlash darajasini belgilaydi.
Auth pluginidan bearer { } sozlamasi bilan foydalaning. Plugin avtomatik ravishda har bir so'rovga Authorization sarlavhasini qo'shadi va 401 javobida refreshTokens orqali tokenni yangilashi mumkin. Misol: install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }.
Ha, Ktor Client DarwinEngine orqali iOS da to'liq ishlaydi, URLSession dan foydalanadi. Barcha plaginlar, serializatsiya va korutinlar iOS da Android dagi kabi ishlaydi. Bu Ktor-ni Kotlin Multiplatform Mobile (KMM) loyihalari uchun asosiy HTTP-mijozga aylantiradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.