Interceptor — bu nədir, OkHttp və Alamofire interceptor növləri

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

Interceptor — HTTP sorğularını və cavablarını loqlama, autentifikasiya, keşləmə və təkrar cəhdlər üçün ələ keçirən OkHttp və Alamofire komponentidir. Square (2026) məlumatlarına görə, düzgün konfiqurasiya edilmiş interceptorlar şəbəkə problemlərinin aradan qaldırılması vaxtını 40% azaldır və xəta idarəetməsini standartlaşdırır. Application Interceptor sorğu başına bir dəfə, Network Interceptor isə hər yönləndirmədə işə düşür.

Əsas məqamlar

  • Interceptor — OkHttp və Alamofire-də HTTP sorğu və cavablarını kəsişən tapşırıqlar üçün ələ keçirən vasitədir.
  • Application Interceptor sorğudan əvvəl və sonra proqram ilə OkHttp arasında bir dəfə icra olunur.
  • Network Interceptor OkHttp daxilində hər yönləndirmə və təkrar cəhddə işə düşür.
  • RequestInterceptor Alamofire-də sorğu adaptasiyası və təkrar cəhdləri birləşdirir.
  • Chain.proceed() — sorğunu interceptor zənciri boyunca ötürən OkHttp-nin əsas metodu.

Interceptor nədir?

Interceptor — serverə göndərilməzdən əvvəl sorğuları və tətbiqə ötürülməzdən əvvəl cavabları ələ keçirib dəyişdirmək üçün HTTP müştərisinə daxil edilən proqram komponentidir. Mobil proqramlaşdırmada interceptorlar kəsişən tapşırıqları həll edir: avtomatik autentifikasiya tokenlərinin əlavə edilməsi, trafikin vaxt ölçmələri ilə loqlanması, müvəqqəti şəbəkə xətalarında təkrar cəhdlər, məlumatların sıxılması və şifrəsinin açılması. Interceptor memarlığı Chain of Responsibility naxışına əsaslanır — hər bir interceptor sorğunu dəyişdirə, icra edə və ya xüsusi cavab qaytararaq zənciri kəsə bilər.

Interceptor zənciri necə işləyir

OkHttp-də interceptorlar zəncir (chain) təşkil edir. Hər bir Interceptor orijinal sorğu ilə Chain obyekti alır və idarəetməni növbəti interceptor-a ötürmək üçün chain.proceed(request) çağırır. Cavab alındıqdan sonra interceptor Response-u təhlil edə, dəyişdirə, xəta olduqda sorğunu təkrarlaya və ya keşləmə üçün xüsusi cavab qaytara bilər. OkHttpClient.Builder-də interceptorların əlavə edilmə sırası onların icra ardıcıllığını müəyyən edir: birinci əlavə edilən göndərmədə birinci, qəbulda isə sonuncu icra olunur.

OkHttp-də Interceptor: Application və Network

OkHttp interceptorları iki növə ayırır. Application Interceptor (addInterceptor) tətbiq kodu ilə OkHttp arasında icra olunur: bir chain.proceed() çağırışı — yönləndirmələrdən asılı olmayaraq serverə bir sorğu. Network Interceptor (addNetworkInterceptor) OkHttp daxilində başlıqlar və əlaqə qurulduqdan sonra icra olunur — hər yönləndirmə, təkrar cəhd və ya autentifikasiyada işə düşür. Bu fərq müəyyən tapşırıq üçün düzgün interceptor növünün seçilməsi üçün kritik əhəmiyyətlidir.

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} ${duration}ms ərzində")
        return response
    }
}

val client = OkHttpClient.Builder()
    .addInterceptor(LoggingInterceptor())
    .addNetworkInterceptor(CacheInterceptor())
    .build()

LoggingInterceptor — metodu, URL-i, cavab kodunu və icra müddətini loqlayan Application Interceptor-dur. addInterceptor() vasitəsilə əlavə edilməsi yönləndirmələrdə təkrarlanmadan istifadəçi sorğusu üçün bir loq təmin edir. CacheInterceptor Network Interceptor olaraq əlavə edilmişdir ki, yalnız OkHttp daxilində HTTP sorğusu qurulduqdan sonra görünən serverin Cache-Control başlıqlarını nəzərə alsın.

Növlər arasında praktik fərq

Tətbiq sorğu göndərdikdə server 302 və ya 301 yönləndirməsi ilə cavab verə bilər. Application Interceptor bütün yönləndirmələrdən sonra yalnız yekun cavabı görür — neçə aralıq sorğunun edildiyini bilmir. Network Interceptor aralıq sorğular və cavablar da daxil olmaqla hər sorğu və cavabı görür. Square (2026) məlumatlarına görə, Network Interceptor həmçinin əlaqə səviyyəsində sıxılmış (gzip) məlumatları görür, Application Interceptor isə artıq açılmış cavabı alır. Həqiqi şəbəkə çağırışlarının sayını hesablamaq üçün Network Interceptor-dan istifadə edin.

Alamofire RequestInterceptor

Alamofire iki protokolu birləşdirən RequestInterceptor protokolunu təqdim edir: göndərmədən əvvəl sorğunu dəyişdirmək üçün RequestAdapter və xətalar zamanı təkrar cəhdlər üçün RequestRetrier. Bu bölgü adaptasiyanı (başlıqların, tokenlərin əlavə edilməsi) təkrar cəhd siyasəti (eksponensial gecikmə, cəhd limiti, xəta növünün yoxlanılması) ilə çevik birləşdirməyə imkan verir. RequestInterceptor hər iki protokolu tətbiq edən bir struktur və ya sinif ilə reallaşdırılı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-də adapt vasitəsilə Bearer token əlavə edir və URLError (şəbəkə itkisi, timeout) zamanı retry ilə 1 saniyə gecikmə ilə sorğunu avtomatik təkrarlayır. Adaptasiya və təkrar cəhdlərin ayrılması onları müstəqil sınaqdan keçirməyə imkan verir — retry məntiqinə toxunmadan adaptasiya üçün vahid test yazmaq olar. Alamofire (2026) məlumatlarına görə, RequestInterceptor iOS layihələrində mərkəzləşdirilmiş autentifikasiya idarəetməsinin standart üsuludur.

Interceptorların istifadə ssenariləri

Loqlama — ən çox yayılmış ssenari. Interceptor URL-i, metodu, başlıqları, sorğu və cavab məzmununu, icra müddətini qeyd edir. Debug yığımlarında bu, Charles Proxy və Wireshark-ı əvəz edir, release-də sorğu konteksti ilə xəta hesabatlarına kömək edir. OkHttp üçün logging-interceptor kitabxanasından NONE, BASIC, HEADERS və BODY səviyyələri ilə HttpLoggingInterceptor istifadə olunur. BODY səviyyəsi sorğu və cavabların tam məzmununu loqlayır — yalnız debug-da istifadə edin.

Autentifikasiya və Refresh Token

Access token müddəti bitdikdə Interceptor 401 cavabını ələ keçirir, refresh token API-ni çağırır və yeni token ilə orijinal sorğunu təkrarlayır. OkHttp-də bu, Authenticator və ya response.code yoxlaması ilə xüsusi Interceptor vasitəsilə həyata keçirilir. Authenticator yalnız cavab başlıqlarına, Interceptor isə tam məzmuna giriş əldə edir. Alamofire-də — token yeniləndikdən sonra .retry qaytaran RequestRetrier vasitəsilə. OWASP (2026) məlumatlarına görə, Interceptor vasitəsilə tokenlərin avtomatik yenilənməsi etimadnamə sızması riskini azaldır.

Ümumi başlıqların əlavə edilməsi

Content-Type, Accept-Language, User-Agent, Device-ID — hər sorğuda tələb olunan başlıqlar. Interceptor onları mərkəzləşdirilmiş şəkildə əlavə edir, hər API metodunda təkrarlanmadan. User-Agent tətbiq başlanğıcında bir dəfə yaradılır: “AppName/1.0 (Android 14; Pixel 8)”. Accept-Language cihazın sistem dilindən götürülür. Alamofire (2026) məlumatlarına görə, Interceptor vasitəsilə başlıqların mərkəzləşdirilmiş idarəsi səhv başlıq xətalarının sayını 30% azaldır.

SsenariOkHttpAlamofire
LoqlamaHttpLoggingInterceptorEventMonitor
Auth tokenAuthenticator + InterceptorRequestInterceptor
BaşlıqlaraddInterceptorRequestAdapter
RetryTəkrarlama ilə InterceptorRequestRetrier
KeşləməCacheInterceptorCachedResponseHandler

Ən yaxşı təcrübələr və zəncir sırası

OkHttp-də Interceptor-un əlavə edilmə sırası bütün zəncirin davranışını müəyyən edir. Birinci əlavə edilən interceptor sorğu göndərmədə birinci, cavab qəbulunda isə sonuncu icra olunur. Loqlama üçün Interceptor-u birinci əlavə edin — digər interceptorların bütün dəyişiklikləri ilə yekun sorğunu görəcək. Sıxılma üçün — sonuncu, sıxılmanın yekun məlumatlara tətbiq edilməsi üçün. Autentifikasiya üçün — təkrar cəhddən əvvəl, tokenin təkrar cəhddən əvvəl yenilənməsi üçün.

Release yığımları üçün tövsiyələr

Release yığımlarında loqlamanı BuildConfig.DEBUG və ya asılılıq inyeksiyası vasitəsilə söndürün. Keşləmə üçün addNetworkInterceptor istifadə edin — Network Interceptor serverin Cache-Control başlıqlarını görür və keşləmə siyasətini düzgün şərh edir. Autentifikasiya üçün addInterceptor (Application) tətbiq edin — bu, avtorizasiya başlıqlarının göndərilməməli olduğu xarici domenlərə yönləndirmələrdə təkrar ələ keçirmənin qarşısını alır. Hər Interceptor-u okhttp-testing-support-dan MockWebServer ilə təcrid olunmuş şəkildə sınaqdan keçirin — o, sorğuları ələ keçirir və əvvəlcədən hazırlanmış cavabları qaytarır, interceptor məntiqini real server olmadan yoxlamağa imkan verir.

Interceptor performansı

Hər bir Interceptor sorğu vaxtına kiçik bir gecikmə əlavə edir. 3–4 interceptorlu tipik zəncirdə (loqlama, autentifikasiya, sıxılma, keşləmə) sorğu başına əlavə yük 5 millisaniyədən azdır. Problemlər Interceptor bloklayan əməliyyatlar yerinə yetirdikdə başlayır: sinxron refresh token API çağırışı, böyük loqların fayla yazılması və ya sorğu məzmununun şifrələnməsi. Bütün bu əməliyyatlar asinxron olmalı və ya fon thread-də icra edilməlidir. Square (2026) məlumatlarına görə, OkHttp Interceptor-u Dispatcher thread hovuzunda icra edir — bir interceptor-un bloklanması bütün zənciri gecikdirir.

  • Sıra əhəmiyyətlidir — loqlama birinci, autentifikasiya təkrar cəhddən əvvəl, sıxılma sonuncu
  • Debug vs Release — HttpLoggingInterceptor yalnız debug yığımlarında
  • Təcrid — hər Interceptor bir tapşırığı həll edir (Single Responsibility)
  • Asinxronluq — Interceptor OkHttp-nin fon thread-də icra olunur, UI-ni bloklamır

Tez-tez verilən suallar

OkHttp-də addInterceptor ilə addNetworkInterceptor arasında nə fərq var?

addInterceptor (Application) tətbiq və OkHttp arasında bir dəfə icra olunur — yönləndirmələri və əlaqə sıxılmasını görmür. addNetworkInterceptor (Network) OkHttp daxilində hər şəbəkə çağırışında icra olunur — yönləndirmələri, təkrar cəhdləri və sıxılmadan sonrakı məlumatları görür. Loqlama və autentifikasiya üçün Application, keşləmə üçün Network seçin.

Interceptor tokeni avtomatik necə yeniləyir?

Interceptor response.code == 401 yoxlayır, Retrofit və ya URLSession vasitəsilə asinxron refresh token API çağırır, yeni tokeni saxlayır və orijinal sorğunu təkrarlayır. OkHttp-də Basic Auth üçün Authenticator, yeniləmə ilə Bearer üçün Interceptor istifadə edin. Alamofire-də — xəta növünü yoxlamaqla retry.

Interceptor tətbiqi yavaşlada bilərmi?

Bəli — Interceptor-da ağır əməliyyatlar (böyük məzmunların loqlanması, şifrələmə, sinxron API çağırışları) cavab müddətini artırır. Asinxron callback-lərdən istifadə edin, loqlamanı yalnız debug yığımları üçün BuildConfig.DEBUG ilə məhdudlaşdırın və intercept metodunda bloklayan əməliyyatlar yerinə yetirməyin.

OkHttp-də Authenticator nədir və Interceptor-dan nə ilə fərqlənir?

Authenticator — Basic Auth və ya Bearer token tətbiq edən 401 cavabları üçün ixtisaslaşmış interceptor-dur. Authenticator sorğunun məzmununa giriş əldə etmir və göndərmədən əvvəl başlıqları dəyişə bilməz — yalnız avtorizasiya xətası olan cavabı emal edə bilər. Interceptor isə sorğunu icranın istənilən mərhələsində dəyişdirə bilər.

Eyni Interceptor-u bütün sorğulara necə əlavə etmək olar?

OkHttp-də Interceptor-u OkHttpClient.Builder-a ötürün — bu müştəridən olan bütün sorğular ondan keçir. Alamofire-də RequestInterceptor-u Session konfiqurasiyasına əlavə edin. Bir neçə müştəri istifadə edirsinizsə (məsələn, müxtəlif API-lər üçün), Builder naxışı ilə ümumi interceptorları olan əsas Builder yaradın.

Nəticə

  • Interceptor — Chain of Responsibility naxışına əsaslanan HTTP sorğu və cavablarını ələ keçirmə mexanizmidir.
  • OkHttp iki növ təklif edir: Application (sorğu başına bir çağırış) və Network (hər yönləndirmə və təkrar cəhd üçün).
  • Alamofire adaptasiyanı (RequestAdapter) və təkrar cəhdləri (RequestRetrier) vahid RequestInterceptor-da ayırır.
  • Əsas ssenarilər — loqlama, autentifikasiya, başlıqlar, təkrar cəhdlər və HTTP cavablarının keşlənməsi.
  • Builder-da Interceptor əlavə etmə sırası ardıcıllığı müəyyən edir: loqlama — birinci, sıxılma — sonuncu.
  • Release yığımları BuildConfig bayraqları və DI inyeksiyası ilə debug loqlamasının söndürülməsini tələb edir.
  • Düzgün konfiqurasiya edilmiş interceptor zənciri şəbəkə problemlərinin aradan qaldırılması vaxtını 40% azaldır və xəta idarəetməsini standartlaşdırır.

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