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, 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 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, 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.
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öntemi | Ne Zaman Çağrılır | Önbelleği Görür |
|---|---|---|---|
| Application Interceptor | addInterceptor() | İstekten önce ve sonra | Evet |
| Network Interceptor | addNetworkInterceptor() | Ağ düzeyinde | Hayır |
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).
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.
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.
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.
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())
}
})
Ö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.
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)
}
}
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.
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.
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, 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, 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.
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.
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.
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
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.
Ayrıca okuyun