Interceptor — nedir, OkHttp ve Alamofire interceptor türleri

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

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 — çapraz kesen endişeler için OkHttp ve Alamofire'da bir HTTP istek ve yanıt yakalayıcısı.
  • Application Interceptor uygulama ile OkHttp arasında istekten önce ve sonra bir kez yürütülür.
  • Network Interceptor OkHttp içinde her yönlendirme ve yeniden denemede tetiklenir.
  • RequestInterceptor Alamofire'da istek uyarlaması ve yeniden denemeleri birleştirir.
  • Chain.proceed() — isteği interceptor zinciri boyunca ileten OkHttp'nin ana yöntemi.

Interceptor Nedir?

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.

Interceptor zinciri nasıl çalışır

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'de Interceptor: Application ve Network

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.

kotlin
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.

Pratikte türler arasındaki fark

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 RequestInterceptor

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.

swift
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.

Interceptor Kullanım Durumları

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.

Kimlik Doğrulama ve Token Yenileme

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.

Ortak başlıklar ekleme

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.

SenaryoOkHttpAlamofire
GünlüklemeHttpLoggingInterceptorEventMonitor
Auth tokeniAuthenticator + InterceptorRequestInterceptor
BaşlıklaraddInterceptorRequestAdapter
Yeniden denemeYeniden denemeli InterceptorRequestRetrier
ÖnbelleklemeCacheInterceptorCachedResponseHandler

En İyi Uygulamalar ve Zincir Sırası

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.

Üretim yapıları için öneriler

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.

Interceptor Performansı

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ıra önemlidir — günlükleme ilk, yeniden denemeden önce kimlik doğrulama, sıkıştırma son
  • Debug ve Release — HttpLoggingInterceptor yalnızca hata ayıklama yapılarında
  • Yalıtım — her Interceptor bir görevi ele alır (Tek Sorumluluk)
  • Eşzamansızlık — Interceptor, OkHttp arka plan iş parçacığında çalışır, UI'yı engellemez

Sıkça Sorulan Sorular

OkHttp'de addInterceptor ve addNetworkInterceptor arasındaki fark nedir?

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.

Bir Interceptor otomatik olarak tokeni nasıl yeniler?

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.

Bir Interceptor uygulamayı yavaşlatabilir mi?

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.

OkHttp'de Authenticator nedir ve Interceptor'dan nasıl farklıdır?

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.

Aynı Interceptor'ı tüm isteklere nasıl eklerim?

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

  • Interceptor — Chain of Responsibility modeline dayalı bir HTTP istek ve yanıt yakalama mekanizması.
  • OkHttp iki tür sunar: Application (istek başına bir çağrı) ve Network (her yönlendirme ve yeniden denemede).
  • Alamofire uyarlamayı (RequestAdapter) ve yeniden denemeleri (RequestRetrier) tek bir RequestInterceptor'da ayırır.
  • Ana kullanım durumları — günlükleme, kimlik doğrulama, başlıklar, yeniden denemeler ve HTTP yanıt önbellekleme.
  • Builder'a Interceptor ekleme sırası yürütme sırasını belirler: günlükleme ilk, sıkıştırma son.
  • Üretim yapıları, BuildConfig bayrakları ve DI enjeksiyonu aracılığıyla hata ayıklama günlüklemesinin devre dışı bırakılmasını gerektirir.
  • İyi yapılandırılmış bir interceptor zinciri, ağ hata ayıklama süresini %40 azaltır ve hata yönetimini standartlaştırır.

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