OkHttp — nedir, özellikleri ve HTTP istemcisinin mimarisi

Yazar: IT Sectr Yayınlanma: 2026-03-07 Okuma süresi: 8 dk

OkHttp, Square tarafından Retrofit ve diğer ağ kütüphanelerinin temeli olarak geliştirilen, Android ve Kotlin için yüksek performanslı bir HTTP istemcisidir. Verimli bağlantı yönetimi, yerleşik önbellekleme ve HTTP/2 desteği sağlar. Square, 2025'e göre, OkHttp dünya çapındaki uygulamalarda günlük milyarlarca isteği işler.

Anahtar Noktalar

  • OkHttp — HTTP/2 ve SPDY desteği ile Square'den Android ve Kotlin için HTTP istemcisi
  • Bağlantı Havuzu — gecikmeyi azaltmak için TCP bağlantılarını yeniden kullanma mekanizması
  • Interceptor'lar — Interceptor ve NetworkInterceptor istekleri ve yanıtları değiştirir
  • Önbellekleme — yerleşik Cache tekrarlanan isteklerde trafiği azaltır
  • WebSocket — WebSocket protokolü üzerinden çift yönlü iletişim desteği

OkHttp Nedir?

OkHttp, Square tarafından geliştirilen Java, Android ve Kotlin için verimli bir HTTP istemcisidir. Kütüphane, HTTP/2, SPDY, WebSocket ve ağ hatalarında otomatik bağlantı kurtarma desteği ile HTTP isteklerini yürütmek için düşük seviyeli bir API sağlar.

OkHttp, 2013 yılında HttpURLConnection'un sorunlarını çözecek güvenilir bir HTTP istemcisi ihtiyacına yanıt olarak ortaya çıktı — bağlantı havuzu eksikliği, zayıf HTTP/2 desteği ve kullanışsız API. 2025 yılına kadar OkHttp, Android API sistem düzeyinde kullanılmaktadır: OkHttp, Android 4.4 (API 19)'ten itibaren HttpURLConnection uygulamasına gömülmüştür.

Google I/O 2024'e göre OkHttp, Android ekosistemindeki tüm HTTP isteklerinin %70'inden fazlasını işler. Bu mümkündür çünkü OkHttp, Retrofit, Apollo GraphQL, Firebase ve diğer birçok kütüphane için taşıma katmanı olarak görev yapar. Geliştiriciler, OkHttp işlevselliğini açıkça eklemeden otomatik olarak elde ederler.

OkHttp Nasıl Çalışır

OkHttp Mimarisi, interceptor zinciri üzerine kurulmuştur. Her istek, isteği, yanıtı değiştirebilen veya yürütmeyi durdurabilen bir dizi interceptor'dan geçer. Bu mimari, Chain of Responsibility desenine benzer ve esnek genişletilebilirlik sağlar.

Bir uygulama istek gönderdiğinde, OkHttp şu adımları gerçekleştirir: DNS'i çözer, havuzdan bir bağlantı seçer, TLS el sıkışmasını açar, HTTP isteğini gönderir, yanıtı alır ve uygulamaya döndürür. RealCall, bir isteğin oluşturulmasından tamamlanmasına kadar tüm yaşam döngüsünü yöneten iç sınıftır.

OkHttp, yönlendirmeleri (302, 301) otomatik olarak işler, ağ hatalarında istekleri yeniden dener, keep-alive protokolünü takip eder ve şeffaf gzip sıkıştırmasını destekler. Geliştiricinin bu işlemler için kod yazması gerekmez — OkHttp bunları sunucu başlıklarına göre otomatik olarak yapar.

HTTP/2 Desteği ve Çoğullama

HTTP/2, head-of-line blokajı (HTTP/1.1'in özelliği) olmadan tek bir TCP bağlantısı üzerinden aynı anda birden fazla istek göndermeye izin verir. OkHttp, sunucu destekliyorsa otomatik olarak HTTP/2 kullanır ve gerektiğinde şeffaf bir şekilde HTTP/1.1'e geri döner.

HTTP/2 çoğullaması, bağlantı kurma gecikmesinin (TCP + TLS) 100–300 ms olabileceği mobil uygulamalar için özellikle önemlidir. OkHttp, 10 sıralı bağlantı yerine tek bir bağlantı kullanarak, dengesiz bağlantılara sahip tipik Android cihazlarda toplam gecikmeyi %40–60 oranında azaltır.

OkHttp Interceptor'ları: Interceptor ve NetworkInterceptor

Interceptor, tek bir yöntem intercept(Chain) ile bir arayüzdür; bir istek alır, eylemler gerçekleştirir ve bir yanıt döndürür. İki tür interceptor vardır: uygulama interceptor'ları (addInterceptor ile eklenen) ve ağ interceptor'ları (addNetworkInterceptor).

Uygulama interceptor'ları, HTTP isteği oluşmadan önce tetiklenir — orijinal isteği ve tüm dönüşümlerden sonraki nihai yanıtı görürler. Ağ interceptor'ları ağ düzeyinde tetiklenir: gzip sıkıştırması, Content-Length başlığı ekleme, yönlendirmeler ve yeniden denemelerden sonraki isteği görürler. Yanıt önbellekten sunulursa ağ interceptor'ları çağrılmaz.

Interceptor TürüEkleme YöntemiNe Zaman ÇağrılırÖnbelleği Görür
Application InterceptoraddInterceptor()İstekten önce ve sonraEvet
Network InterceptoraddNetworkInterceptor()Ağ düzeyindeHayır

Interceptor'ların Pratik Kullanımı

Pratikte, OkHttp interceptor'ları üç ana görevi çözer: yetkilendirme (Authorization başlığını ekleme), günlük kaydı (hata ayıklama için HttpLoggingInterceptor) ve yeniden deneme (ağ hatalarında otomatik istek tekrarı). Birden fazla interceptor'u birleştirerek, uygulamanın her HTTP çağrısında kod tekrarı olmadan eksiksiz bir istek işleme hattı oluşturulabilir.

Interceptor'ların eklenme sırası önemlidir: önce eklenen Interceptor, girişte ilk, çıkışta son çalışır. NetworkInterceptor için sıra, ağ yığını tarafından belirlenir. Önerilen sıra: AuthInterceptor (token ekler), LoggingInterceptor (isteği kaydeder), RetryInterceptor (hatalarda yeniden dener).

HttpLoggingInterceptor ile Günlük Kaydı

Ağ isteklerinde hata ayıklamak için HttpLoggingInterceptor kullanılır — Square'den hazır bir interceptor. Yöntemi, URL'yi, başlıkları ve istek/yanıt gövdesini kaydeder. Günlük seviyeleri: BASIC (yöntem + URL + kod), HEADERS (başlıklarla) ve BODY (tam istek ve yanıt). BODY geliştirme sırasında kullanışlıdır ancak güvenlik ve performans nedenleriyle üretimde devre dışı bırakılır.

Kotlin'de OkHttp Kod Örnekleri

OkHttp kullanarak temel bir GET isteğine bakalım. Önce, bir OkHttpClient oluşturulur — bir kez oluşturulan ve yeniden kullanılan ağır bir nesne. Ardından bir URL ile Request oluşturulur ve istek execute ile senkron veya enqueue ile asenkron olarak yürütülür.

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

Asenkron yürütme için, bir Callback kabul eden enqueue yöntemi kullanılır. OkHttp, isteği bir arka plan dizisinde yürütür ve sonucu aynı dizideki geri aramaya döndürür. Android ana dizisine geçmek için Handler veya coroutine kullanın.

kotlin
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(
        call: Call, e: IOException
    ) {
        println("İstek başarısız oldu: ${e.message}")
    }

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

Yetkilendirme İçin Interceptor Ekleme

Özel bir Interceptor, her isteğe bir Bearer token ekler. Interceptor, Authorization başlığının varlığını kontrol eder ve token henüz ayarlanmamışsa, depolamadan ekler. 401 yanıtında, interceptor Authenticator aracılığıyla token'ı yenileyebilir.

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'de Bağlantı Havuzu ve Önbellekleme

Bağlantı Havuzu (ConnectionPool), birden fazla istek için TCP bağlantılarını yeniden kullanmaya izin veren önemli bir OkHttp optimizasyonudur. Her istek için yeni bir soket oluşturmak yerine, OkHttp varsayılan olarak 5 dakika boyunca en fazla 5 boşta bağlantı depolar ve aynı sunucuya tekrarlanan isteklerde gecikmeyi %30–70 oranında azaltır.

Yanıt önbelleklemesi, Cache sınıfı aracılığıyla uygulanır. Önbelleği etkinleştirmek için OkHttpClient.Builder'da dizini ve maksimum boyutu belirtmeniz yeterlidir. OkHttp, Cache-Control, Expires ve ETag başlıklarına göre GET yanıtlarını otomatik olarak önbelleğe alır ve güncel değillerse ağ isteği olmadan önbelleklenmiş verileri döndürü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()

Havuz ve önbelleğin doğru yapılandırılması, sık istek gönderen uygulamalar — haber akışları, sohbetler, veri güncellemeleri — için özellikle önemlidir. Havuz olmadan, her TCP bağlantısı üç yönlü el sıkışma (SYN, SYN-ACK, ACK) ve potansiyel olarak TLS el sıkışması (2–3 gidiş-dönüş) gerektirir ve her isteğe 100–500 ms ekler.

OkHttp ayrıca RealWebSocket sınıfı aracılığıyla WebSocket'i de destekler. Bir WebSocket bağlantısı, HTTP el sıkışması (101 Switching Protocols) ile kurulur ve ardından çift yönlü bir protokole geçer. OkHttp, bağlantıyı canlı tutmak için otomatik olarak ping çerçeveleri gönderir ve bağlantı kesildiğinde yeniden bağlanır. OkHttp'nin WebSocket'i, wss://echo.websocket.org gibi standart uç noktalarla uyumludur.

OkHttp ile Çalışırken Yaygın Hatalar

Her istek için OkHttpClient oluşturmak en yaygın hatadır. OkHttpClient, bir bağlantı havuzu, önbellek ve iş parçacığı havuzu içerir. Her istek için yeni bir örnek oluşturmak yalnızca bellek israfına yol açmakla kalmaz, aynı zamanda bağlantı yeniden kullanımının avantajını da kaybettirir. OkHttpClient, bir DI kabı aracılığıyla bir singleton olmalıdır.

Response.body() kapatmayı ihmal etmek kaynak sızıntısına yol açar. ResponseBody, okuduktan sonra kapatılması gereken bir InputStream içerir. body().string() veya body().bytes() kullanılırsa, OkHttp akışı otomatik olarak kapatır, ancak body().byteStream() veya body().charStream() okunurken bir finally bloğunda açık bir close() çağrısı gerekir.

Zaman Aşımı işleme eksikliği başka bir sorundur. Varsayılan olarak, OkHttp'nin connectTimeout'u 10 saniye, readTimeout'u 10 saniye ve writeTimeout'u 10 saniyedir. Dengesiz bağlantılara sahip mobil uygulamalar için connectTimeout'un 15–30 saniye ve readTimeout'un 15–30 saniye olarak ayarlanması önerilir, aksi takdirde kullanıcı zayıf sinyalle çok uzun süre bekler.

Sıkça Sorulan Sorular

OkHttp, Retrofit'ten nasıl farklıdır?

OkHttp, manuel Request ve Response yönetimi olan düşük seviyeli bir HTTP istemcisidir. Retrofit, ek açıklamalarla yüksek seviyeli bir soyutlamadır. OkHttp, Retrofit için taşıma katmanı olarak kullanılır, ancak ek kütüphaneler olmadan bağımsız olarak da çalışabilir.

OkHttp HTTPS'yi nasıl işler?

OkHttp, TLS el sıkışması için SSLSocketFactory kullanır. Kütüphane, sertifika sabitleme için CertificatePinner, özel doğrulama için TrustManager ve sertifikaya karşı ana bilgisayar adını kontrol etmek için HostnameVerifier'ı destekler.

OkHttp'de ağ hataları nasıl yakalanır?

Senkron istekler, ağ sorunlarında IOException fırlatır. Asenkron istekler, IOException ile onFailure çağrısı alır. HTTP hataları (4xx, 5xx) için yanıt başarılı kabul edilir — hata kodu response.isSuccessful() ile kontrol edilir.

OkHttp WebSocket'i destekliyor mu?

Evet, OkHttp, WebSocket sınıfı ve WebSocketListener aracılığıyla yerleşik WebSocket desteğine sahiptir. Bağlantı kurulduktan sonra WebSocket, tekrarlanan HTTP istekleri olmadan gerçek zamanlı olarak mesaj gönderip almaya olanak tanır.

OkHttp'de yönlendirmeler nasıl devre dışı bırakılır?

OkHttpClient.Builder'da followRedirects(false) ve followSslRedirects(false) aracılığıyla otomatik yönlendirmeleri devre dışı bırakın. Bu, örneğin yönlendirme URL'sinden bir token çıkarmak için bir yönlendirmeyi manuel olarak işlemeniz gerektiğinde kullanışlıdır.

Özet

  • OkHttp — HTTP/2 ve SPDY desteği ile Square'den yüksek performanslı HTTP istemcisi
  • Interceptor mimarisi, istek değişikliği için Chain of Responsibility uygular
  • Bağlantı havuzu TCP bağlantılarını yeniden kullanarak gecikmeyi %30–70 azaltır
  • Önbellekleme Cache-Control ve ETag tekrarlanan isteklerde trafiği azaltır
  • WebSocket gerçek zamanlı çift yönlü iletişim sağlar
  • OkHttpClient bir singleton olmalıdır — istek başına bir tane oluşturmak sızıntılara yol açar
  • ResponseBody, byteStream ile okurken açık kapatma gerektirir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun