OkHttp — bu nədir, imkanları və HTTP-klientin arxitekturası

Müəllif: IT Sectr Dərc olunub: 2026-03-07 Oxuma vaxtı: 8 dəq

OkHttp — Square şirkəti tərəfindən Retrofit və digər şəbəkə kitabxanaları üçün əsas kimi hazırlanmış Android və Kotlin üçün yüksək məhsuldar HTTP-klientdir. O, birləşmələrin səmərəli idarə edilməsini, daxili keşləməni və HTTP/2 dəstəyini təmin edir. Square, 2025 məlumatlarına görə, OkHttp dünya üzrə tətbiqlərdə gündəlik milyardlarla sorğunu emal edir.

Əsas məqamlar

  • OkHttp — Square-dən HTTP/2 və SPDY dəstəyi ilə Android və Kotlin üçün HTTP-klient
  • Birləşmə hovuzu — gecikmələri azaltmaq üçün TCP birləşmələrinin təkrar istifadə mexanizmi
  • Interceptorlar Interceptor və NetworkInterceptor sorğu və cavabları dəyişdirir
  • Keşləmə — daxili Cache təkrar sorğularda trafiki azaldır
  • WebSocket — WebSocket protokolu ilə ikitərəfli rabitə dəstəyi

OkHttp nədir?

OkHttp — Square şirkəti tərəfindən hazırlanmış Java, Android və Kotlin üçün səmərəli HTTP-klientdir. Kitabxana HTTP/2, SPDY, WebSocket dəstəyi və şəbəkə nasazlıqlarında birləşmələrin avtomatik bərpası ilə HTTP sorğularını yerinə yetirmək üçün aşağı səviyyəli API təqdim edir.

OkHttp 2013-cü ildə HttpURLConnection-un problemlərini — birləşmə hovuzunun olmaması, HTTP/2-nin zəif dəstəyi və əlverişsiz API-ni həll edəcək etibarlı HTTP-klientə ehtiyac cavabı olaraq ortaya çıxdı. 2025-ci ilə qədər OkHttp Android API sistem səviyyəsində istifadə olunur: OkHttp Android 4.4-dən (API 19) başlayaraq HttpURLConnection tətbiqinə daxil edilmişdir.

Google I/O 2024 məlumatlarına görə, OkHttp Android ekosistemində bütün HTTP sorğularının 70%-dən çoxunu emal edir. Bu mümkündür, çünki OkHttp Retrofit, Apollo GraphQL, Firebase və bir çox digər kitabxanalar üçün nəqil qatıdır. Tərtibatçılar OkHttp funksionallığını açıq şəkildə qoşmadan avtomatik əldə edirlər.

OkHttp necə işləyir

OkHttp arxitekturası interceptor zənciri (Interceptor chain) üzərində qurulmuşdur. Hər sorğu Request, Response-ni dəyişdirə və ya icranı dayandıra bilən interceptorlar ardıcıllığından keçir. Bu arxitektura Chain of Responsibility nümunəsini xatırladır və funksionallığı çevik şəkildə genişləndirməyə imkan verir.

Tətbiq sorğu göndərdikdə, OkHttp aşağıdakı addımları yerinə yetirir: DNS-i həll edir, hovuzdan birləşmə seçir (və ya yenisini yaradır), TLS əl sıxmasını açır (əgər HTTPS varsa), HTTP sorğusunu göndərir, cavab alır və onu tətbiqə qaytarır. RealCall sorğunun tam həyat dövrünü yaradılmadan tamamlanana qədər idarə edən daxili sinifdir.

OkHttp avtomatik olaraq yönləndirmələri (302, 301) idarə edir, şəbəkə nasazlıqlarında sorğuları təkrarlayır (retry), keep-alive protokoluna əməl edir və şəffaf gzip sıxılmasını dəstəkləyir. Tərtibatçı bu əməliyyatlar üçün kod yazmalı deyil — OkHttp onları server başlıqları əsasında avtomatik yerinə yetirir.

HTTP/2 dəstəyi və multipleksasiya

HTTP/2 eyni vaxtda bir TCP birləşməsi vasitəsilə bloklamadan (HTTP/1.1-ə xas olan head-of-line blocking) çoxlu sorğu göndərməyə imkan verir. OkHttp, server bu protokolu dəstəkləyirsə, avtomatik olaraq HTTP/2 istifadə edir və lazım olduqda şəffaf şəkildə HTTP/1.1-ə keçir.

HTTP/2 multipleksasiyası xüsusilə mobil tətbiqlər üçün vacibdir, burada birləşmə qurulma gecikməsi (TCP + TLS) 100–300 ms ola bilər. 10 ardıcıl birləşmə əvəzinə OkHttp bir birləşmə istifadə edərək qeyri-sabit birləşməsi olan tipik Android cihazlarında ümumi gecikməni 40–60% azaldır.

OkHttp interceptorları: Interceptor və NetworkInterceptor

Interceptor — Request qəbul edən, hərəkətləri yerinə yetirən və Response qaytaran tək intercept(Chain) metodu olan interfeysdir. Interceptorlar iki növdür: tətbiq interceptorları (addInterceptor vasitəsilə əlavə olunur) və şəbəkə interceptorları (addNetworkInterceptor).

Tətbiq interceptorları HTTP sorğusu formalaşmadan əvvəl işə düşür — onlar orijinal Request və bütün çevrilmələrdən sonra yekun Response görürlər. Şəbəkə interceptorları şəbəkə səviyyəsində işə düşür: onlar sorğunu gzip sıxılmasından, Content-Length başlıqlarının əlavə edilməsindən, yönləndirmələrdən və təkrar cəhdlərdən sonra görürlər. Cavab keşdən alınıbsa, şəbəkə interceptorları çağırılmır.

Interceptor növüƏlavə etmə metoduNə vaxt çağırılırKeşi görür
Application InterceptoraddInterceptor()Sorğudan əvvəl və sonraBəli
Network InterceptoraddNetworkInterceptor()Şəbəkə səviyyəsindəXeyr

Interceptorların praktikada tətbiqi

Praktikada OkHttp interceptorları üç əsas vəzifəni həll edir: avtorizasiya (Authorization başlığının əlavə edilməsi), loqlama (debug üçün HttpLoggingInterceptor) və təkrar cəhd (şəbəkə nasazlıqlarında sorğunun avtomatik təkrarlanması). Bir neçə interceptor birləşdirərək, tətbiqin hər HTTP çağırışında kod təkrarlanmadan tam sorğu emal pipeline-i qurmaq olar.

Interceptorların əlavə edilmə sırası önəm daşıyır: birinci əlavə edilən Interceptor girişdə birinci, çıxışda sonuncu yerinə yetirilir. NetworkInterceptor üçün sıra şəbəkə yığını ilə müəyyən edilir. Tövsiyə olunan sıra: AuthInterceptor (token əlavə edir), LoggingInterceptor (sorğunu loqlayır), RetryInterceptor (nasazlıqlarda təkrarlayır).

HttpLoggingInterceptor vasitəsilə loqlama

Şəbəkə sorğularının debug edilməsi üçün HttpLoggingInterceptor — Square-dən hazır interceptor istifadə olunur. O, metodu, URL-i, başlıqları və sorğu-cavabın gövdəsini loqlayır. Loqlama səviyyələri: BASIC (metod + URL + kod), HEADERS (başlıqlarla) və BODY (tam sorğu və cavab). BODY inkişaf zamanı faydalıdır, lakin istehsalda təhlükəsizlik və performans səbəbindən söndürülür.

Kotlin-də OkHttp kod nümunələri

Əsas GET sorğusunu OkHttp vasitəsilə nəzərdən keçirək. Əvvəlcə OkHttpClient yaradılır — bir dəfə yaradılan və təkrar istifadə olunan ağır obyekt. Sonra URL ilə Request formalaşdırılır və sorğu execute vasitəsilə sinxron və ya enqueue vasitəsilə asinxron yerinə yetirilir.

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 icra üçün Callback qəbul edən enqueue metodu istifadə olunur. OkHttp sorğunu fon thread-də yerinə yetirir və nəticəni eyni thread-də callback-ə qaytarır. Android-in əsas thread-inə keçmək üçün Handler və ya korutinlərdən istifadə edin.

kotlin
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(
        call: Call, e: IOException
    ) {
        println("Sorğu uğursuz oldu: ${e.message}")
    }

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

Avtorizasiya üçün interceptor əlavə edilməsi

Fərdi Interceptor hər sorğuya Bearer token əlavə edir. Interceptor Authorization başlığının mövcudluğunu yoxlayır və əgər token hələ qurulmayıbsa, onu anbardan əlavə edir. 401 cavabı zamanı interceptor Authenticator vasitəsilə tokeni yeniləyə bilər.

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 birləşmə hovuzu və keşləmə

Birləşmə hovuzu (ConnectionPool) — OkHttp-nin çoxlu sorğular üçün TCP birləşmələrini təkrar istifadə etməyə imkan verən əsas optimallaşdırmasıdır. Hər sorğu üçün yeni soket yaratmaq əvəzinə, OkHttp 5 dəqiqə ərzində 5 qeyri-aktiv birləşməni (standart olaraq) saxlayır ki, bu da eyni hosta təkrar sorğular üçün gecikməni 30–70% azaldır.

Cavabların keşlənməsi Cache sinfi vasitəsilə həyata keçirilir. Keşi aktivləşdirmək üçün OkHttpClient.Builder-da kataloq və maksimum ölçü göstərmək kifayətdir. OkHttp avtomatik olaraq Cache-Control, Expires və ETag başlıqlarına uyğun olaraq GET cavablarını keşləyir və əgər onlar köhnəlməyibsə, şəbəkə sorğusu olmadan keşlənmiş məlumatları qaytarır.

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

Hovuz və keşin düzgün konfiqurasiyası xüsusilə tez-tez sorğu göndərən tətbiqlər — xəbər lentləri, söhbətlər, məlumat yeniləmələri üçün vacibdir. Hovuz olmadan hər TCP birləşməsi üçtərəfli əl sıxması (SYN, SYN-ACK, ACK) və potensial olaraq TLS əl sıxması (2–3 round-trip) tələb olunur ki, bu da hər sorğuya 100–500 ms əlavə edir.

OkHttp həmçinin RealWebSocket sinfi vasitəsilə WebSocket-i dəstəkləyir. WebSocket birləşməsi HTTP əl sıxması (101 Switching Protocols) vasitəsilə qurulur və sonra ikitərəfli protokola keçir. OkHttp birləşməni canlı saxlamaq üçün avtomatik ping çərçivələri göndərir və qopma zamanı yenidən qoşulur. OkHttp-dan WebSocket wss://echo.websocket.org kimi standart endpoint-lərlə uyğundur.

OkHttp ilə işləyərkən tipik səhvlər

Hər sorğu üçün OkHttpClient yaratmaq — ən geniş yayılmış səhvdir. OkHttpClient birləşmə hovuzu, keş və thread hovuzu ehtiva edir. Hər sorğu üçün yeni nüsxə yaratmaq təkcə yaddaşı israf etmir, həm də birləşmələrin təkrar istifadəsi üstünlüyündən məhrum edir. OkHttpClient DI konteyneri vasitəsilə sinqlton olmalıdır.

Response.body() bağlanmasına məhəl qoymamaq resurs sızmasına gətirib çıxarır. ResponseBody oxunduqdan sonra bağlanmalı olan InputStream ehtiva edir. body().string() və ya body().bytes() istifadə edilərsə, OkHttp axını avtomatik bağlayır, lakin body().byteStream() və ya body().charStream() oxunarkən finally blokunda açıq şəkildə close() çağırılması tələb olunur.

Timeout-un işlənməməsi — başqa bir problem. Standart olaraq OkHttp-nin vaxt aşımı yoxdur (connectTimeout = 10 saniyə, readTimeout = 10 saniyə, writeTimeout = 10 saniyə). Qeyri-sabit birləşməsi olan mobil tətbiqlər üçün connectTimeout 15–30 saniyə və readTimeout 15–30 saniyə təyin etmək tövsiyə olunur, əks halda istifadəçi zəif siqnalda çox uzun gözləyəcək.

Tez-tez verilən suallar

OkHttp Retrofit-dən nə ilə fərqlənir?

OkHttp Request və Response-un əl ilə idarə olunduğu aşağı səviyyəli HTTP-klientdir. Retrofit annotasiyalarla yüksək səviyyəli əlavədir. OkHttp Retrofit üçün nəqil kimi istifadə olunur, lakin əlavə kitabxanalar olmadan müstəqil işləyə bilər.

OkHttp HTTPS-i necə emal edir?

OkHttp TLS əl sıxması üçün SSLSocketFactory istifadə edir. Kitabxana sertifikatların bağlanması (Certificate Pinning) üçün CertificatePinner, fərdi doğrulama üçün TrustManager və sertifikata qarşı host adının yoxlanması üçün HostnameVerifier dəstəkləyir.

OkHttp-də şəbəkə xətalarını necə tutmaq olar?

Sinxron sorğular şəbəkə problemlərində IOException atır. Asinxron sorğular IOException ilə onFailure çağırışı alır. HTTP xətaları üçün (4xx, 5xx) cavab uğurlu sayılır — xəta kodu response.isSuccessful() vasitəsilə yoxlanılır.

OkHttp WebSocket-i dəstəkləyir?

Bəli, OkHttp WebSocket sinfi və WebSocketListener vasitəsilə daxili WebSocket dəstəyinə malikdir. Birləşmə qurulduqdan sonra WebSocket təkrar HTTP sorğuları olmadan real vaxtda mesaj göndərmək və qəbul etmək imkanı verir.

OkHttp-də yönləndirmələri necə söndürmək olar?

OkHttpClient.Builder-da followRedirects(false)followSslRedirects(false) vasitəsilə avtomatik yönləndirmələri söndürün. Bu, yönləndirməni əl ilə idarə etmək lazım olduqda, məsələn, yönləndirmə URL-indən token çıxarmaq üçün faydalıdır.

Nəticə

  • OkHttp — Square-dən HTTP/2 və SPDY dəstəyi ilə yüksək məhsuldar HTTP-klient
  • Interceptor arxitekturası sorğuların dəyişdirilməsi üçün Chain of Responsibility-ni tətbiq edir
  • Birləşmə hovuzu TCP birləşmələrini təkrar istifadə edərək gecikməni 30–70% azaldır
  • Keşləmə Cache-Control və ETag təkrar sorğularda trafiki azaldır
  • WebSocket real vaxtda ikitərəfli rabitə təmin edir
  • OkHttpClient sinqlton olmalıdır — hər sorğu üçün yaratmaq sızmalara səbəb olur
  • ResponseBody byteStream ilə axın oxunarkən açıq bağlanma tələb edir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun