Interceptor, OkHttp ve Alamofire'ın günlükleme, kimlik doğrulama, önbelleğe alma ve yeniden deneme için HTTP isteklerini ve yanıtlarını yakalayan bir bileşenidir. Square (2026)'ye göre, doğru yapılandırılmış interceptor'lar ağ hata ayıklama süresini %40 azaltır ve hata yönetimini standartlaştırır. Application Interceptor istek başına bir kez çalışırken, Network Interceptor her yönlendirmede çalışır.
Önemli Noktalar
Interceptor, sunucuya gönderilmeden önce istekleri ve uygulamaya ulaşmadan önce yanıtları yakalamak ve değiştirmek için bir HTTP istemcisine enjekte edilen bir yazılım bileşenidir. Mobil geliştirmede, interceptor'lar çapraz kesen endişeleri ele alır: otomatik kimlik doğrulama tokeni enjeksiyonu, zaman ölçümleriyle trafik günlüklemesi, geçici ağ hatalarında yeniden denemeler ve anında veri sıkıştırma ve şifre çözme. Interceptor mimarisi Chain of Responsibility modeline dayanır — her interceptor isteği değiştirebilir, yürütebilir veya özel bir yanıt döndürerek zinciri kesebilir.
OkHttp'de interceptor'lar bir zincir oluşturur. Her Interceptor, orijinal istekle birlikte bir Chain nesnesi alır ve kontrolü bir sonraki interceptor'a devretmek için chain.proceed(request) öğesini çağırır. Yanıtı aldıktan sonra, interceptor Yanıtı analiz edebilir, değiştirebilir, hata durumunda isteği yeniden deneyebilir veya önbelleğe alma için özel bir yanıt döndürebilir. Interceptor'ların OkHttpClient.Builder'a eklenme sırası, yürütme sıralarını belirler: ilk eklenen, gönderirken ilk ve alırken son yürütülür.
OkHttp interceptor'ları iki türe ayırır. Application Interceptor (addInterceptor), uygulama kodu ile OkHttp arasında yürütülür: bir chain.proceed() çağrısı — yönlendirmelerden bağımsız olarak sunucuya bir istek. Network Interceptor (addNetworkInterceptor), başlık oluşumu ve bağlantıdan sonra OkHttp içinde yürütülür — her yönlendirme, yeniden deneme veya kimlik doğrulama girişiminde tetiklenir. Bu ayrım, belirli bir görev için doğru interceptor türünü seçmek açısından kritiktir.
class LoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
Log.d("HTTP", "${request.method} ${request.url}")
val startTime = System.currentTimeMillis()
val response = chain.proceed(request)
val duration = System.currentTimeMillis() - startTime
Log.d("HTTP", "${response.code} in ${duration}ms")
return response
}
}
val client = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.addNetworkInterceptor(CacheInterceptor())
.build()
LoggingInterceptor — yöntemi, URL'yi, yanıt kodunu ve yürütme süresini günlükleyen bir Application Interceptor. addInterceptor() ile eklemek, yönlendirmelerde tekrarlama olmadan kullanıcı isteği başına bir günlük garanti eder. CacheInterceptor, HTTP isteği oluşturulduktan sonra yalnızca OkHttp içinde görülebilen sunucu Cache-Control başlıklarını hesaba katmak için Network Interceptor olarak eklenir.
Uygulama bir istek yaptığında, sunucu 302 veya 301 yönlendirmesiyle yanıt verebilir. Application Interceptor tüm yönlendirmelerden sonra yalnızca nihai yanıtı görür — kaç ara istek yapıldığını bilmez. Network Interceptor ara olanlar dahil her isteği ve yanıtı görür. Square (2026)'ye göre, Network Interceptor bağlantı düzeyinde sıkıştırılmış verileri (gzip) de görürken, Application Interceptor zaten sıkıştırılmış yanıtı alır. Gerçek ağ çağrılarının sayısını saymak için Network Interceptor kullanın.
Alamofire, iki protokolü birleştiren RequestInterceptor protokolünü sağlar: göndermeden önce isteği değiştirmek için RequestAdapter ve hatalarda yeniden denemeler için RequestRetrier. Bu ayrım, uyarlamanın (başlık, token ekleme) yeniden deneme politikasıyla (üssel geri alma, deneme sınırı, hata türü kontrolü) esnek bir şekilde birleştirilmesine olanak tanır. RequestInterceptor, her iki protokole de uyum sağlayan tek bir yapı veya sınıf tarafından uygulanır.
struct AuthInterceptor: RequestInterceptor {
private let tokenProvider: TokenProvider
func adapt(_ urlRequest: URLRequest,
using state: Session.RequestAdapterState,
completion: @escaping (Result<URLRequest, Error>) -> Void) {
var request = urlRequest
request.setValue("Bearer \(tokenProvider.token)",
forHTTPHeaderField: "Authorization")
completion(.success(request))
}
func retry(_ request: Request,
for session: Session,
dueTo error: Error,
completion: @escaping (RetryResult) -> Void) {
if error is URLError {
completion(.retryWithDelay(1))
} else {
completion(.doNotRetry)
}
}
}
AuthInterceptor Swift'te adapt aracılığıyla bir Bearer tokeni ekler ve 1 saniyelik bir gecikmeyle retry aracılığıyla URLError (ağ kaybı, zaman aşımı) durumunda isteği otomatik olarak yeniden dener. Uyarlama ve yeniden denemeleri ayırmak, bunların bağımsız olarak test edilmesini sağlar — yeniden deneme mantığını etkilemeden uyarlama için bir birim testi yazabilirsiniz. Alamofire (2026)'ye göre RequestInterceptor, iOS projelerinde kimlik doğrulama yönetimini merkezileştirmenin standart yoludur.
Günlükleme — en yaygın kullanım durumu. Interceptor, URL'yi, yöntemi, başlıkları, istek ve yanıt gövdesini ve yürütme süresini kaydeder. Hata ayıklama yapılarında bu, Charles Proxy ve Wireshark'ın yerini alır; sürüm yapılarında istek bağlamıyla birlikte çökme raporlarına yardımcı olur. OkHttp, logging-interceptor kitaplığından HttpLoggingInterceptor'ı NONE, BASIC, HEADERS ve BODY düzeyleriyle kullanır. BODY düzeyi, tam istek ve yanıt gövdelerini günlükler — yalnızca hata ayıklamada kullanın.
Erişim tokeninin süresi dolduğunda, Interceptor 401 yanıtını yakalar, token yenileme API'sini çağırır ve yeni tokenle orijinal isteği yeniden dener. OkHttp'de bu, Authenticator veya response.code denetimi olan özel bir Interceptor aracılığıyla uygulanır. Authenticator'ın yalnızca yanıt başlıklarına erişimi varken, Interceptor'ın tam gövdeye erişimi vardır. Alamofire'da — RequestRetrier aracılığıyla, token yenilemeden sonra .retry döndürür. OWASP (2026)'ye göre, Interceptor aracılığıyla otomatik token yenileme, kimlik bilgisi sızıntısı riskini azaltır.
Content-Type, Accept-Language, User-Agent, Device-ID — her istekte gerekli olan başlıklar. Interceptor bunları her API yönteminde tekrarlama olmadan merkezi olarak ekler. User-Agent, uygulama başlangıcında bir kez oluşturulur: “AppName/1.0 (Android 14; Pixel 8)”. Accept-Language, cihaz sistem dilinden alınır. Alamofire (2026)'ye göre, Interceptor aracılığıyla merkezi başlık yönetimi, hatalı başlık hatalarını %30 azaltır.
| Senaryo | OkHttp | Alamofire |
|---|---|---|
| Günlükleme | HttpLoggingInterceptor | EventMonitor |
| Auth tokeni | Authenticator + Interceptor | RequestInterceptor |
| Başlıklar | addInterceptor | RequestAdapter |
| Yeniden deneme | Yeniden denemeli Interceptor | RequestRetrier |
| Önbellekleme | CacheInterceptor | CachedResponseHandler |
OkHttp'de Interceptor'ları ekleme sırası tüm zincirin davranışını belirler. İlk eklenen interceptor, istek gönderilirken ilk ve yanıt alınırken son yürütülür. Günlükleme için Interceptor'u ilk önce ekleyin — diğer interceptor'lardan gelen tüm değişikliklerle birlikte nihai isteği görecektir. Sıkıştırma için son ekleyin, böylece sıkıştırma nihai verilere uygulanır. Kimlik doğrulama için yeniden denemeden önce ekleyin, böylece bir sonraki denemeden önce token yenilenir.
Sürüm yapılarında, BuildConfig.DEBUG veya bağımlılık enjeksiyonu aracılığıyla günlüklemeyi devre dışı bırakın. Önbellekleme için addNetworkInterceptor kullanın — Network Interceptor, sunucu Cache-Control başlıklarını görür ve önbellekleme politikasını doğru şekilde yorumlar. Kimlik doğrulama için addInterceptor (Application) kullanın — bu, yetkilendirme başlıklarının gönderilmemesi gereken üçüncü taraf alan adlarına yönlendirmelerde yeniden yakalamayı önler. Her Interceptor'u okhttp-testing-support'dan MockWebServer kullanarak izole bir şekilde test edin — istekleri yakalar ve önceden hazırlanmış yanıtlar döndürerek gerçek bir sunucu olmadan interceptor mantığını doğrulamanıza olanak tanır.
Her Interceptor, istek süresine küçük bir gecikme ekler. 3-4 interceptor'luk (günlükleme, kimlik doğrulama, sıkıştırma, önbellekleme) tipik bir zincirde, ek yük istek başına 5 milisaniyeden azdır. Bir Interceptor engelleyici işlemler gerçekleştirdiğinde sorunlar ortaya çıkar: senkron token yenileme API çağrısı, büyük günlükleri bir dosyaya yazma veya istek gövdesini şifreleme. Tüm bu işlemler eşzamansız olmalı veya bir arka plan iş parçacığında yürütülmelidir. Square (2026)'ye göre OkHttp, Interceptor'ları Dispatcher iş parçacığı havuzunda yürütür — bir interceptor'u engellemek tüm zinciri geciktirir.
Sıkça Sorulan Sorular
addInterceptor (Application) uygulama ile OkHttp arasında bir kez yürütülür — yönlendirmeleri veya bağlantı sıkıştırmasını görmez. addNetworkInterceptor (Network) her ağ çağrısında OkHttp içinde yürütülür — sıkıştırmadan sonra yönlendirmeleri, yeniden denemeleri ve verileri görür. Günlükleme ve kimlik doğrulama için Application'ı, önbellekleme için Network'ü seçin.
Interceptor, response.code == 401 durumunu kontrol eder, Retrofit veya URLSession aracılığıyla eşzamansız bir token yenileme API'si çağırır, yeni tokeni kaydeder ve orijinal isteği yeniden dener. OkHttp'de Basic Auth için Authenticator ve yenilemeli Bearer için Interceptor kullanın. Alamofire'da — hata türü kontrolüyle retry kullanın.
Evet — bir Interceptor'daki ağır işlemler (büyük gövdeleri günlükleme, şifreleme, senkron API çağrıları) yanıt süresini artırır. Eşzamansız geri çağırmalar kullanın, BuildConfig.DEBUG aracılığıyla günlüklemeyi yalnızca hata ayıklama yapılarıyla sınırlayın ve intercept yönteminde engelleyici işlemler gerçekleştirmeyin.
Authenticator, Basic Auth veya Bearer tokeni uygulayan, 401 yanıtları için özelleşmiş bir interceptor'dır. Authenticator'ın istek gövdesine erişimi yoktur ve göndermeden önce başlıkları değiştiremez — yalnızca yetkilendirme hata yanıtını işler. Öte yandan bir Interceptor, isteği yürütmenin herhangi bir aşamasında değiştirebilir.
OkHttp'de, Interceptor'ı OkHttpClient.Builder'a iletin — bu istemciden gelen tüm istekler ondan geçer. Alamofire'da, RequestInterceptor'ı Session yapılandırmasına ekleyin. Birden çok istemci kullanıyorsanız (örneğin, farklı API'ler için), Builder modelini kullanarak ortak interceptor'lara sahip bir temel Builder oluşturun.
Ö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