Ktor: bu nima, asinxron HTTP-mijozning xususiyatlari

Muallif: IT Sectr Nashr etilgan: 2026-03-07 O'qish vaqti: 8 daq

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 — ko'p platformalilikni qo'llab-quvvatlovchi Kotlin uchun asinxron HTTP-mijoz
  • Korutinlar — qayta chaqiruvlar va reaktiv oqimlarsiz so'rovlarni bajarish asosi
  • Plaginlar — serializatsiya, jurnallashtirish va avtorizatsiya uchun modul kengaytma tizimi
  • Ko'p platformalilik — Android, iOS, Desktop va Server uchun bitta kod
  • Kotlinx Serialization — @Serializable orqali reflektisyasiz mahalliy serializatsiya

Ktor nima?

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 qanday ishlaydi

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.

So'rovni qayta ishlash quvur liniyasi

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.

Ktor Client plaginlari

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.

PluginVazifasi
ContentNegotiationKotlinx Serialization orqali JSON, XML serializatsiyasi va deserializatsiyasi
LoggingDaraja sozlamasi bilan so'rov va javoblarni jurnallashtirish
AuthAvtomatik tokenni yangilash bilan Basic, Bearer, Digest autentifikatsiyasi
HttpTimeoutUlanish, o'qish va so'rov vaqt chegaralarini sozlash
ContentEncodingShaffof gzip va deflate siqish
DefaultRequestBarcha so'rovlar uchun standart qiymatlarni o'rnatish

Maxsus plaginlar

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.

Kotlin-da Ktor Client kod namunalari

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.

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()
}

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.

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)
    }
}

Vaqt chegaralari va sarlavhalarni sozlash

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.

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

Ktor-ning ko'p platformalilik qo'llab-quvvatlashi

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.

Ktor bilan ishlashda odatiy xatolar

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 Retrofit-dan qanday farq qiladi?

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 qaysi Ktor dvigateli yaxshiroq?

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.

Ktor HTTP/2 ni qo'llab-quvvatlaydimi?

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.

Ktor Client-da avtorizatsiyani qanday sozlash kerak?

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) } } }.

Ktor Client ni iOS da ishlatish mumkinmi?

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

  • Ktor — JetBrains-dan ko'p platformalilikni qo'llab-quvvatlovchi asinxron HTTP-mijoz
  • Kotlin DSL annotatsiyalarni almashtiradi — reflektisyasiz dastur bloklari orqali sozlash
  • Plaginlar ContentNegotiation, Auth, Logging va HttpTimeout modul ravishda funksionallikni kengaytiradi
  • Korutinlar — bajarish asosi: barcha metodlar qayta chaqiruvlar va reaktiv oqimlarsiz suspend
  • Ko'p platformalilik — Android, iOS, Desktop, Server va JS uchun bitta kod
  • Dvigatellar OkHttp, Darwin, CIO Ktor-ni muayyan platformaga moslashtiradi
  • HttpResponseValidator try-catch takrorlanmasdan HTTP xatolarini boshqarishni markazlashtiradi

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.

Loyihani muhokama qilish

Shuningdek o'qing