Interceptor — bu nima, OkHttp va Alamofire interceptors turlari

Muallif: IT Sectr Nashr etilgan: 2026-03-08 O'qish vaqti: 8 daq

Interceptor — HTTP so‘rovlari va javoblarini loglash, autentifikatsiya, keshlash va qayta urinishlar uchun tutib oluvchi OkHttp va Alamofire komponentidir. Square (2026) ma’lumotlariga ko‘ra, to‘g‘ri sozlangan interceptors tarmoq muammolarini bartaraf etish vaqtini 40% ga qisqartiradi va xatolarni boshqarishni standartlashtiradi. Application Interceptor so‘rov uchun bir marta, Network Interceptor esa har bir qayta yo‘naltirishda ishga tushadi.

Asosiy fikrlar

  • Interceptor — OkHttp va Alamofire da HTTP so‘rov va javoblarini kesishuvchi vazifalar uchun tutib oluvchi.
  • Application Interceptor so‘rovdan oldin va keyin ilova bilan OkHttp o‘rtasida bir marta bajariladi.
  • Network Interceptor OkHttp ichida har bir qayta yo‘naltirish va qayta urinishda ishga tushadi.
  • RequestInterceptor Alamofire da so‘rov adaptatsiyasi va qayta urinishlarni birlashtiradi.
  • Chain.proceed() — so‘rovni interceptors zanjiri bo‘ylab uzatuvchi OkHttp ning asosiy metodi.

Interceptor nima?

Interceptor — serverga jo‘natishdan oldin so‘rovlarni va ilovaga uzatishdan oldin javoblarni tutib olish va o‘zgartirish uchun HTTP mijoziga kiritiladigan dasturiy komponent. Mobil dasturlashda interceptors kesishuvchi vazifalarni hal qiladi: avtomatik autentifikatsiya tokenlarini qo‘shish, trafikni vaqt o‘lchovlari bilan loglash, vaqtinchalik tarmoq xatolarida qayta urinishlar, ma’lumotlarni siqish va shifrini ochish. Interceptor arxitekturasi Chain of Responsibility namunasiga asoslanadi — har bir interceptor so‘rovni o‘zgartirishi, uni bajarishi yoki maxsus javob qaytarib zanjirni uzishi mumkin.

Interceptor zanjiri qanday ishlaydi

OkHttp da interceptors zanjir (chain) hosil qiladi. Har bir Interceptor asl so‘rov bilan Chain obyektini oladi va boshqaruvni keyingi interceptorga uzatish uchun chain.proceed(request) ni chaqiradi. Javob olingandan so‘ng, interceptor Response ni tahlil qilishi, o‘zgartirishi, xatoda so‘rovni takrorlashi yoki keshlash uchun maxsus javob qaytarishi mumkin. Interceptorlarni OkHttpClient.Builder ga qo‘shish tartibi ularning bajarilish ketma-ketligini belgilaydi: birinchi qo‘shilgan jo‘natishda birinchi, qabulda esa oxirgi bajariladi.

OkHttp da Interceptor: Application va Network

OkHttp interceptorsni ikki turga ajratadi. Application Interceptor (addInterceptor) ilova kodi bilan OkHttp o‘rtasida bajariladi: bitta chain.proceed() chaqiruvi — qayta yo‘naltirishlardan qat’iy nazar serverga bitta so‘rov. Network Interceptor (addNetworkInterceptor) OkHttp ichida sarlavhalar va ulanish hosil qilingandan so‘ng bajariladi — har bir qayta yo‘naltirish, qayta urinish yoki autentifikatsiyada ishga tushadi. Bu farq muayyan vazifa uchun to‘g‘ri interceptor turini tanlash uchun muhimdir.

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 da")
        return response
    }
}

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

LoggingInterceptor — metod, URL, javob kodi va bajarilish vaqtini loglaydigan Application Interceptor. addInterceptor() orqali qo‘shish qayta yo‘naltirishlarda takrorlanmasdan foydalanuvchi so‘rovi uchun bitta logni kafolatlaydi. CacheInterceptor Network Interceptor sifatida qo‘shilgan, chunki serverning Cache-Control sarlavhalari faqat OkHttp ichida HTTP so‘rovi hosil qilingandan so‘ng ko‘rinadi.

Turlar o‘rtasidagi amaliy farq

Ilova so‘rov yuborganda server 302 yoki 301 qayta yo‘naltirishi bilan javob berishi mumkin. Application Interceptor barcha qayta yo‘naltirishlardan so‘ng faqat yakuniy javobni ko‘radi — qancha oraliq so‘rov qilinganini bilmaydi. Network Interceptor oraliq so‘rov va javoblar hamda har bir so‘rov va javobni ko‘radi. Square (2026) ma’lumotlariga ko‘ra, Network Interceptor ulanish darajasida siqilgan (gzip) ma’lumotlarni ham ko‘radi, Application Interceptor esa allaqachon ochilgan javobni oladi. Haqiqiy tarmoq chaqiruvlari sonini hisoblash uchun Network Interceptordan foydalaning.

Alamofire RequestInterceptor

Alamofire ikkita protokolni birlashtiruvchi RequestInterceptor protokolini taqdim etadi: jo‘natishdan oldin so‘rovni o‘zgartirish uchun RequestAdapter va xatolarda qayta urinishlar uchun RequestRetrier. Bu bo‘linish adaptatsiyani (sarlavhalar, tokenlar qo‘shish) qayta urinish siyosati (eksponensial kechikish, urinishlar chegarasi, xato turini tekshirish) bilan moslashuvchan birlashtirishga imkon beradi. RequestInterceptor ikkala protokolni amalga oshiradigan bitta struktura yoki sinf tomonidan amalga oshiriladi.

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 da adapt orqali Bearer token qo‘shadi va URLError (tarmoq uzilishi, timeout) da retry orqali 1 soniya kechikish bilan so‘rovni avtomatik takrorlaydi. Adaptatsiya va qayta urinishlarning ajratilishi ularni mustaqil sinovdan o‘tkazishga imkon beradi — retry mantiqiga ta’sir qilmasdan adaptatsiya uchun birlik test yozish mumkin. Alamofire (2026) ma’lumotlariga ko‘ra, RequestInterceptor iOS loyihalarida markazlashtirilgan autentifikatsiya boshqaruvining standart usulidir.

Interceptorlardan foydalanish stsenariylari

Loglash — eng keng tarqalgan stsenariy. Interceptor URL, metod, sarlavhalar, so‘rov va javob tanasini, bajarilish vaqtini yozib oladi. Debug yig‘imlarida bu Charles Proxy va Wireshark o‘rnini bosadi, release da — so‘rov konteksti bilan xato hisobotlariga yordam beradi. OkHttp uchun logging-interceptor kutubxonasidan NONE, BASIC, HEADERS va BODY darajalari bilan HttpLoggingInterceptor ishlatiladi. BODY darajasi so‘rov va javoblarning to‘liq tanasini loglaydi — faqat debug da foydalaning.

Autentifikatsiya va Refresh Token

Access token muddati tugaganda, Interceptor 401 javobini tutib oladi, refresh token API ni chaqiradi va yangi token bilan asl so‘rovni takrorlaydi. OkHttp da bu Authenticator yoki response.code tekshiruvi bilan maxsus Interceptor orqali amalga oshiriladi. Authenticator faqat javob sarlavhalariga, Interceptor esa to‘liq tanaga kirish huquqiga ega. Alamofire da — token yangilangandan so‘ng .retry qaytaruvchi RequestRetrier orqali. OWASP (2026) ma’lumotlariga ko‘ra, Interceptor orqali tokenlarni avtomatik yangilash akkreditivlar sizib chiqishi xavfini kamaytiradi.

Umumiy sarlavhalarni qo‘shish

Content-Type, Accept-Language, User-Agent, Device-ID — har bir so‘rovda talab qilinadigan sarlavhalar. Interceptor ularni markazlashtirilgan holda qo‘shadi, har bir API metodida takrorlanmasdan. User-Agent ilova ishga tushganda bir marta yaratiladi: “AppName/1.0 (Android 14; Pixel 8)”. Accept-Language qurilmaning tizim tilidan olinadi. Alamofire (2026) ma’lumotlariga ko‘ra, Interceptor orqali sarlavhalarni markazlashtirilgan boshqarish noto‘g‘ri sarlavha xatolari sonini 30% ga kamaytiradi.

StsenariyOkHttpAlamofire
LoglashHttpLoggingInterceptorEventMonitor
Auth tokenAuthenticator + InterceptorRequestInterceptor
SarlavhalaraddInterceptorRequestAdapter
RetryTakrorlash bilan InterceptorRequestRetrier
KeshlashCacheInterceptorCachedResponseHandler

Eng yaxshi amaliyotlar va zanjir tartibi

OkHttp da Interceptor qo‘shish tartibi butun zanjirning xatti-harakatini belgilaydi. Birinchi qo‘shilgan interceptor so‘rov jo‘natishda birinchi, javob qabul qilishda esa oxirgi bajariladi. Loglash uchun Interceptorni birinchi qo‘shing — u boshqa interceptorlarning barcha o‘zgartirishlari bilan yakuniy so‘rovni ko‘radi. Siqish uchun — oxirgi, siqish yakuniy ma’lumotlarga qo‘llanilishi uchun. Autentifikatsiya uchun — qayta urinishdan oldin, token qayta urinishdan oldin yangilanishi uchun.

Release yig‘imlari uchun tavsiyalar

Release yig‘imlarida loglashni BuildConfig.DEBUG yoki bog‘liqlik inyeksiyasi orqali o‘chiring. Keshlash uchun addNetworkInterceptor dan foydalaning — Network Interceptor serverning Cache-Control sarlavhalarini ko‘radi va keshlash siyosatini to‘g‘ri talqin qiladi. Autentifikatsiya uchun addInterceptor (Application) ni qo‘llang — bu avtorizatsiya sarlavhalari jo‘natilmasligi kerak bo‘lgan tashqi domenlarga qayta yo‘naltirishlarda qayta tutib olishning oldini oladi. Har bir Interceptorni okhttp-testing-support dan MockWebServer bilan alohida sinovdan o‘tkazing — u so‘rovlarni tutib oladi va oldindan tayyorlangan javoblarni qaytaradi, interceptor mantiqini real serversiz tekshirishga imkon beradi.

Interceptor samaradorligi

Har bir Interceptor so‘rov vaqtiga kichik kechikish qo‘shadi. 3–4 interceptorli odatdagi zanjirda (loglash, autentifikatsiya, siqish, keshlash) so‘rov uchun qo‘shimcha yuk 5 millisekunddan kam. Muammolar Interceptor bloklovchi operatsiyalarni bajarganida boshlanadi: sinxron refresh token API chaqiruvi, katta loglarni faylga yozish yoki so‘rov tanasini shifrlash. Bu operatsiyalarning barchasi asinxron yoki fon thread da bajarilishi kerak. Square (2026) ma’lumotlariga ko‘ra, OkHttp Interceptorni Dispatcher thread hovuzida bajaradi — bitta interceptor bloklanishi butun zanjirni kechiktiradi.

  • Tartib muhim — loglash birinchi, autentifikatsiya qayta urinishdan oldin, siqish oxirgi
  • Debug vs Release — HttpLoggingInterceptor faqat debug yig‘imlarida
  • Izolyatsiya — har bir Interceptor bitta vazifani hal qiladi (Single Responsibility)
  • Asinxronlik — Interceptor OkHttp ning fon thread ida bajariladi, UI ni bloklamaydi

Tez-tez beriladigan savollar

OkHttp da addInterceptor va addNetworkInterceptor o‘rtasidagi farq nima?

addInterceptor (Application) ilova va OkHttp o‘rtasida bir marta bajariladi — qayta yo‘naltirishlar va ulanish siqilishini ko‘rmaydi. addNetworkInterceptor (Network) OkHttp ichida har bir tarmoq chaqiruvida bajariladi — qayta yo‘naltirishlar, qayta urinishlar va siqishdan keyingi ma’lumotlarni ko‘radi. Loglash va autentifikatsiya uchun Application, keshlash uchun Network ni tanlang.

Interceptor tokeni avtomatik qanday yangilaydi?

Interceptor response.code == 401 ni tekshiradi, Retrofit yoki URLSession orqali asinxron refresh token API ni chaqiradi, yangi tokeni saqlaydi va asl so‘rovni takrorlaydi. OkHttp da Basic Auth uchun Authenticator, yangilash bilan Bearer uchun Interceptordan foydalaning. Alamofire da — xato turini tekshirish bilan retry.

Interceptor ilovani sekinlashtirishi mumkinmi?

Ha — Interceptordagi og‘ir operatsiyalar (katta tanani loglash, shifrlash, sinxron API chaqiruvlari) javob vaqtini oshiradi. Asinxron callbacklardan foydalaning, loglashni faqat debug yig‘imlari uchun BuildConfig.DEBUG orqali cheklang va intercept metodida bloklovchi operatsiyalarni bajarmang.

OkHttp da Authenticator nima va Interceptordan qanday farq qiladi?

Authenticator — Basic Auth yoki Bearer tokenni amalga oshiruvchi 401 javoblari uchun ixtisoslashgan interceptordir. Authenticator so‘rov tanasiga kirish huquqiga ega emas va jo‘natishdan oldin sarlavhalarni o‘zgartira olmaydi — faqat avtorizatsiya xatosi bilan javobni qayta ishlay oladi. Interceptor esa so‘rovni bajarilishning istalgan bosqichida o‘zgartirishi mumkin.

Xuddi shu Interceptorni barcha so‘rovlarga qanday qo‘shish mumkin?

OkHttp da Interceptorni OkHttpClient.Builder ga uzating — bu mijozdagi barcha so‘rovlar undan o‘tadi. Alamofire da RequestInterceptorni Session konfiguratsiyasiga qo‘shing. Agar bir nechta mijozdan foydalansangiz (masalan, turli API lar uchun), Builder namunasi bilan umumiy interceptorlarga ega bazaviy Builder yarating.

Xulosa

  • Interceptor — Chain of Responsibility namunasiga asoslangan HTTP so‘rov va javoblarini tutib olish mexanizmi.
  • OkHttp ikki turni taklif qiladi: Application (so‘rov uchun bitta chaqiruv) va Network (har bir qayta yo‘naltirish va qayta urinish uchun).
  • Alamofire adaptatsiyani (RequestAdapter) va qayta urinishlarni (RequestRetrier) yagona RequestInterceptor da ajratadi.
  • Asosiy stsenariylar — loglash, autentifikatsiya, sarlavhalar, qayta urinishlar va HTTP javoblarini keshlash.
  • Interceptor qo‘shish tartibi Builder da ketma-ketlikni belgilaydi: loglash — birinchi, siqish — oxirgi.
  • Release yig‘imlari BuildConfig bayroqlari va DI inyeksiyasi orqali debug loglashni o‘chirishni talab qiladi.
  • To‘g‘ri sozlangan interceptor zanjiri tarmoq muammolarini bartaraf etish vaqtini 40% ga qisqartiradi va xatolarni boshqarishni standartlashtiradi.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing