OkHttp — bu nima, imkoniyatlari va HTTP-klient arxitekturasi

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

OkHttp — Square kompaniyasi tomonidan Retrofit va boshqa tarmoq kutubxonalari uchun asos sifatida ishlab chiqilgan Android va Kotlin uchun yuqori samarali HTTP-klientdir. U ulanishlarni samarali boshqarish, o'rnatilgan keshlash va HTTP/2 qo'llab-quvvatlashni ta'minlaydi. Square, 2025 ma'lumotlariga ko'ra, OkHttp dunyo bo'ylab ilovalarda har kuni milliardlab so'rovlarni qayta ishlaydi.

Asosiy ma'lumotlar

  • OkHttp — Square dan HTTP/2 va SPDY qo'llab-quvvatlashi bilan Android va Kotlin uchun HTTP-klient
  • Ulanishlar havuzi — kechikishlarni kamaytirish uchun TCP ulanishlarini qayta ishlatish mexanizmi
  • Interceptorlar Interceptor va NetworkInterceptor so'rov va javoblarni o'zgartiradi
  • Keshlash — o'rnatilgan Cache takroriy so'rovlarda trafikni kamaytiradi
  • WebSocket — WebSocket protokoli orqali ikki tomonlama aloqa qo'llab-quvvatlashi

OkHttp nima?

OkHttp — Square kompaniyasi tomonidan ishlab chiqilgan Java, Android va Kotlin uchun samarali HTTP-klientdir. Kutubxona HTTP/2, SPDY, WebSocket qo'llab-quvvatlashi va tarmoq nosozliklarida ulanishlarni avtomatik tiklash bilan HTTP so'rovlarini bajarish uchun past darajadagi API taqdim etadi.

OkHttp 2013 yilda HttpURLConnection muammolarini — ulanishlar havuzining yo'qligi, HTTP/2 ni zaif qo'llab-quvvatlash va noqulay API ni hal qiladigan ishonchli HTTP-klientga ehtiyojga javob sifatida paydo bo'ldi. 2025 yilga kelib OkHttp Android API tizim darajasida qo'llaniladi: OkHttp Android 4.4 dan (API 19) boshlab HttpURLConnection implementatsiyasiga o'rnatilgan.

Google I/O 2024 ma'lumotlariga ko'ra, OkHttp Android ekotizimidagi barcha HTTP so'rovlarining 70% dan ortig'ini qayta ishlaydi. Bu mumkin, chunki OkHttp Retrofit, Apollo GraphQL, Firebase va boshqa ko'plab kutubxonalar uchun transport qatlamidir. Dasturchilar OkHttp funksionalligini uni aniq ulamasdan avtomatik ravishda olishadi.

OkHttp qanday ishlaydi

OkHttp arxitekturasi interceptor zanjiri (Interceptor chain) asosida qurilgan. Har bir so'rov Request, Response ni o'zgartirishi yoki bajarilishini to'xtatishi mumkin bo'lgan interceptorlar ketma-ketligidan o'tadi. Ushbu arxitektura Chain of Responsibility naqshini eslatadi va funksionallikni moslashuvchan kengaytirish imkonini beradi.

Ilova so'rov yuborganda, OkHttp quyidagi qadamlarni bajaradi: DNS ni hal qiladi, havuzdan ulanishni tanlaydi (yoki yangisini yaratadi), TLS qo'l siqishini ochadi (agar HTTPS bo'lsa), HTTP so'rovini yuboradi, javobni oladi va uni ilovaga qaytaradi. RealCall so'rovning to'liq hayot aylanishini yaratilishdan tugatishgacha boshqaradigan ichki sinfdir.

OkHttp avtomatik ravishda qayta yo'naltirishlarni (302, 301) boshqaradi, tarmoq nosozliklarida so'rovlarni takrorlaydi (retry), keep-alive protokoliga amal qiladi va shaffof gzip siqishni qo'llab-quvvatlaydi. Dasturchi bu operatsiyalar uchun kod yozishi shart emas — OkHttp ularni server sarlavhalari asosida avtomatik bajaradi.

HTTP/2 qo'llab-quvvatlashi va multipleksatsiya

HTTP/2 bir TCP ulanishi orqali bir vaqtning o'zida blokirovkasiz (HTTP/1.1 ga xos bo'lgan head-of-line blocking) bir nechta so'rovlarni yuborish imkonini beradi. OkHttp agar server ushbu protokolni qo'llab-quvvatlasa, avtomatik ravishda HTTP/2 dan foydalanadi va kerak bo'lganda shaffof tarzda HTTP/1.1 ga o'tadi.

HTTP/2 multipleksatsiyasi ayniqsa mobil ilovalar uchun muhimdir, bunda ulanishni o'rnatish kechikishi (TCP + TLS) 100–300 ms bo'lishi mumkin. 10 ketma-ket ulanish o'rniga OkHttp bitta ulanishdan foydalanadi va beqaror ulanishga ega odatdagi Android qurilmalarida umumiy kechikishni 40–60% kamaytiradi.

OkHttp interceptorlari: Interceptor va NetworkInterceptor

Interceptor — Request qabul qiladigan, harakatlarni bajaradigan va Response qaytaradigan yagona intercept(Chain) metodiga ega interfeysdir. Interceptorlar ikki turga bo'linadi: ilova interceptorlari (addInterceptor orqali qo'shiladi) va tarmoq interceptorlari (addNetworkInterceptor).

Ilova interceptorlari HTTP so'rovi shakllanishidan oldin ishga tushadi — ular asl Request va barcha o'zgarishlardan so'ng yakuniy Response ni ko'rishadi. Tarmoq interceptorlari tarmoq darajasida ishga tushadi: ular so'rovni gzip siqish, Content-Length sarlavhalari qo'shilishi, qayta yo'naltirishlar va qayta urinishlardan keyin ko'rishadi. Agar javob keshlangan bo'lsa, tarmoq interceptorlari chaqirilmaydi.

Interceptor turiQo'shish usuliQachon chaqiriladiKeshni ko'radi
Application InterceptoraddInterceptor()So'rovdan oldin va keyinHa
Network InterceptoraddNetworkInterceptor()Tarmoq darajasidaYo'q

Interceptorlarni amalda qo'llash

Amalda OkHttp interceptorlari uchta asosiy vazifani hal qiladi: avtorizatsiya (Authorization sarlavhasini qo'shish), loglash (nosozliklarni tuzatish uchun HttpLoggingInterceptor) va qayta urinish (tarmoq nosozliklarida so'rovni avtomatik takrorlash). Bir nechta interceptorlarni birlashtirib, ilovaning har bir HTTP chaqiruvida kodni takrorlamasdan to'liq so'rovni qayta ishlash pipeline ini qurish mumkin.

Interceptorlarni qo'shish tartibi muhim: birinchi qo'shilgan Interceptor kirishda birinchi va chiqishda oxirgi bajariladi. NetworkInterceptor uchun tartib tarmoq steki tomonidan belgilanadi. Tavsiya etiladigan tartib: AuthInterceptor (token qo'shadi), LoggingInterceptor (so'rovni loglaydi), RetryInterceptor (nosozliklarda takrorlaydi).

HttpLoggingInterceptor orqali loglash

Tarmoq so'rovlarini nosozliklardan tozalash uchun HttpLoggingInterceptor — Square dan tayyor interceptor ishlatiladi. U metod, URL, sarlavhalar va so'rov-javob tanasini loglaydi. Loglash darajalari: BASIC (metod + URL + kod), HEADERS (sarlavhalar bilan) va BODY (to'liq so'rov va javob). BODY ishlab chiqish vaqtida foydali, ammo ishlab chiqarishda xavfsizlik va samaradorlik sababli o'chiriladi.

Kotlin da OkHttp kod misollari

Asosiy GET so'rovini OkHttp orqali ko'rib chiqaylik. Avval OkHttpClient yaratiladi — bir marta yaratiladigan va qayta ishlatiladigan og'ir obyekt. Keyin URL bilan Request shakllantiriladi va so'rov execute orqali sinxron yoki enqueue orqali asinxron bajariladi.

kotlin
val client = OkHttpClient.Builder()
    .connectTimeout(15, TimeUnit.SECONDS)
    .readTimeout(15, TimeUnit.SECONDS)
    .build()

val request = Request.Builder()
    .url("https://api.github.com/users/octocat")
    .header("Accept", "application/vnd.github.v3+json")
    .build()

val response = client.newCall(request).execute()
println(response.body()?.string())

Asinxron bajarish uchun Callback qabul qiluvchi enqueue metodi ishlatiladi. OkHttp so'rovni fon oqimida bajaradi va natijani o'sha oqimdagi callback ga qaytaradi. Android ning asosiy oqimiga o'tish uchun Handler yoki korutinlardan foydalaning.

kotlin
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(
        call: Call, e: IOException
    ) {
        println("So'rov bajarilmadi: ${e.message}")
    }

    override fun onResponse(
        call: Call, response: Response
    ) {
        println(response.body()?.string())
    }
})

Avtorizatsiya uchun interceptor qo'shish

Maxsus Interceptor har bir so'rovga Bearer token qo'shadi. Interceptor Authorization sarlavhasi mavjudligini tekshiradi va agar token hali o'rnatilmagan bo'lsa, uni ombordan qo'shadi. 201 javobida interceptor Authenticator orqali tokeni yangilashi mumkin.

kotlin
class AuthInterceptor(
    private val tokenProvider: () -> String?
) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalRequest = chain.request()
        val token = tokenProvider.invoke()
        val request = originalRequest.newBuilder()
            .header("Authorization", "Bearer $token")
            .build()
        return chain.proceed(request)
    }
}

OkHttp ulanishlar havuzi va keshlash

Ulanishlar havuzi (ConnectionPool) — OkHttp ning bir nechta so'rovlar uchun TCP ulanishlarini qayta ishlatish imkonini beruvchi asosiy optimallashtirishidir. Har bir so'rov uchun yangi soket yaratish o'rniga, OkHttp 5 daqiqa davomida 5 ta faol bo'lmagan ulanishni (standart bo'yicha) saqlaydi, bu esa bir xil hostga takroriy so'rovlar uchun kechikishni 30–70% kamaytiradi.

Javoblarni keshlash Cache sinfi orqali amalga oshiriladi. Keshni yoqish uchun OkHttpClient.Builder da katalog va maksimal hajmni ko'rsatish kifoya. OkHttp avtomatik ravishda Cache-Control, Expires va ETag sarlavhalariga muvofiq GET javoblarini keshlaydi va agar ular eskirgan bo'lmasa, tarmoq so'rovlarisiz keshlangan ma'lumotlarni qaytaradi.

kotlin
val cacheDir = File(context.cacheDir, "http-cache")
val cache = Cache(cacheDir, 10L * 1024 * 1024)

val client = OkHttpClient.Builder()
    .cache(cache)
    .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))
    .build()

Havuz va keshni to'g'ri sozlash ayniqsa tez-tez so'rov yuboradigan ilovalar — yangiliklar lentalari, chatlar, ma'lumot yangilanishlari uchun muhimdir. Havuzsiz har bir TCP ulanishi uch tomonlama qo'l siqish (SYN, SYN-ACK, ACK) va potensial TLS qo'l siqish (2–3 round-trip) talab qiladi, bu har bir so'rovga 100–500 ms qo'shadi.

OkHttp shuningdek RealWebSocket sinfi orqali WebSocket ni qo'llab-quvvatlaydi. WebSocket ulanishi HTTP qo'l siqishi (101 Switching Protocols) orqali o'rnatiladi va so'ngra ikki tomonlama protokolga o'tadi. OkHttp ulanishni tirik saqlash uchun avtomatik ping ramkalarini yuboradi va uzilishda qayta ulanadi. OkHttp dan WebSocket wss://echo.websocket.org kabi standart endpoint lar bilan mos keladi.

OkHttp bilan ishlashda odatiy xatolar

Har bir so'rov uchun OkHttpClient yaratish — eng keng tarqalgan xato. OkHttpClient ulanishlar havuzi, kesh va oqimlar havuzini o'z ichiga oladi. Har bir so'rov uchun yangi nusxa yaratish nafaqat xotirani isrof qiladi, balki ulanishlarni qayta ishlatish afzalligidan ham mahrum qiladi. OkHttpClient DI konteyneri orqali singleton bo'lishi kerak.

Response.body() ni yopishga e'tibor bermaslik resurs oqishiga olib keladi. ResponseBody o'qilgandan so'ng yopilishi kerak bo'lgan InputStream ni o'z ichiga oladi. Agar body().string() yoki body().bytes() ishlatilsa, OkHttp oqimni avtomatik yopadi, ammo body().byteStream() yoki body().charStream() o'qilayotganda finally blokida aniq close() chaqiruvi talab qilinadi.

Timeout ni ishlatmaslik — yana bir muammo. Standart bo'yicha OkHttp vaqt chegarasiga ega emas (connectTimeout = 10 soniya, readTimeout = 10 soniya, writeTimeout = 10 soniya). Beqaror ulanishga ega mobil ilovalar uchun connectTimeout 15–30 soniya va readTimeout 15–30 soniya o'rnatish tavsiya etiladi, aks holda foydalanuvchi zaif signalda juda uzoq kutadi.

Ko'p beriladigan savollar

OkHttp Retrofit dan qanday farq qiladi?

OkHttp — Request va Response ni qo'lda boshqariladigan past darajadagi HTTP-klient. Retrofit annotatsiyalar bilan yuqori darajadagi qoplama. OkHttp Retrofit uchun transport sifatida ishlatiladi, lekin qo'shimcha kutubxonalarsiz mustaqil ishlashi mumkin.

OkHttp HTTPS ni qanday qayta ishlaydi?

OkHttp TLS qo'l siqishi uchun SSLSocketFactory dan foydalanadi. Kutubxona sertifikatlarni bog'lash (Certificate Pinning) uchun CertificatePinner, maxsus tekshirish uchun TrustManager va sertifikatga qarshi host nomini tekshirish uchun HostnameVerifier ni qo'llab-quvvatlaydi.

OkHttp da tarmoq xatolarini qanday ushlash mumkin?

Sinxron so'rovlar tarmoq muammolarida IOException tashlaydi. Asinxron so'rovlar IOException bilan onFailure chaqiruvini oladi. HTTP xatolari (4xx, 5xx) uchun javob muvaffaqiyatli hisoblanadi — xato kodi response.isSuccessful() orqali tekshiriladi.

OkHttp WebSocket ni qo'llab-quvvatlaydimi?

Ha, OkHttp WebSocket sinfi va WebSocketListener orqali o'rnatilgan WebSocket qo'llab-quvvatlashiga ega. Ulanish o'rnatilgandan so'ng, WebSocket takroriy HTTP so'rovlarisiz real vaqtda xabarlarni yuborish va qabul qilish imkonini beradi.

OkHttp da qayta yo'naltirishlarni qanday o'chirish mumkin?

OkHttpClient.Builder da followRedirects(false) va followSslRedirects(false) orqali avtomatik qayta yo'naltirishlarni o'chiring. Bu qayta yo'naltirishni qo'lda boshqarish kerak bo'lganda, masalan, qayta yo'naltirish URL idan token olish uchun foydali.

Xulosa

  • OkHttp — Square dan HTTP/2 va SPDY qo'llab-quvvatlashi bilan yuqori samarali HTTP-klient
  • Interceptor arxitekturasi so'rovlarni o'zgartirish uchun Chain of Responsibility ni qo'llaydi
  • Ulanishlar havuzi TCP ulanishlarini qayta ishlatadi, kechikishni 30–70% kamaytiradi
  • Keshlash Cache-Control va ETag takroriy so'rovlarda trafikni kamaytiradi
  • WebSocket real vaqtda ikki tomonlama aloqani ta'minlaydi
  • OkHttpClient singleton bo'lishi kerak — har bir so'rov uchun yaratish oqishlarga olib keladi
  • ResponseBody byteStream bilan oqimli o'qishda aniq yopishni talab qiladi

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