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 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 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 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.
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 turi | Qo'shish usuli | Qachon chaqiriladi | Keshni ko'radi |
|---|---|---|---|
| Application Interceptor | addInterceptor() | So'rovdan oldin va keyin | Ha |
| Network Interceptor | addNetworkInterceptor() | Tarmoq darajasida | Yo'q |
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).
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.
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.
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.
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())
}
})
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.
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)
}
}
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.
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.
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 — 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 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.
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.
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.
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
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.