Interceptor — apa itu, jenis-jenis interceptor OkHttp dan Alamofire

Penulis: IT Sectr Diterbitkan: 2026-03-08 Waktu membaca: 8 mnt

Interceptor — komponen OkHttp dan Alamofire yang mencegat permintaan dan respons HTTP untuk pencatatan, autentikasi, caching, dan percobaan ulang. Menurut data Square (2026), interceptor yang dikonfigurasi dengan benar mengurangi waktu debugging masalah jaringan hingga 40% dan menstandarkan penanganan kesalahan. Application Interceptor dipicu sekali per permintaan, Network Interceptor — pada setiap pengalihan.

Poin Utama

  • Interceptor — pencegat permintaan dan respons HTTP di OkHttp dan Alamofire untuk tugas lintas sektor.
  • Application Interceptor dijalankan sekali sebelum dan sesudah permintaan antara aplikasi dan OkHttp.
  • Network Interceptor dipicu pada setiap pengalihan dan percobaan ulang di dalam OkHttp.
  • RequestInterceptor di Alamofire menggabungkan adaptasi permintaan dan percobaan ulang.
  • Chain.proceed() — metode kunci OkHttp yang meneruskan permintaan melalui rantai interceptor.

Apa itu Interceptor?

Interceptor — komponen perangkat lunak yang dimasukkan ke dalam klien HTTP untuk mencegat dan memodifikasi permintaan sebelum dikirim ke server dan respons sebelum diteruskan ke aplikasi. Dalam pengembangan mobile, interceptor menyelesaikan tugas lintas sektor: penambahan token autentikasi secara otomatis, pencatatan lalu lintas dengan pengukuran waktu, percobaan ulang pada kesalahan jaringan sementara, kompresi dan dekripsi data secara langsung. Arsitektur Interceptor didasarkan pada pola Chain of Responsibility — setiap interceptor dapat memodifikasi permintaan, menjalankannya, atau memutus rantai dengan mengembalikan respons khusus.

Bagaimana rantai interceptor bekerja

Di OkHttp, interceptor membentuk rantai (chain). Setiap Interceptor menerima objek Chain dengan permintaan asli dan memanggil chain.proceed(request) untuk meneruskan kendali ke interceptor berikutnya. Setelah menerima respons, interceptor dapat menganalisis Response, memodifikasinya, mengulang permintaan saat kesalahan, atau mengembalikan respons khusus untuk caching. Urutan penambahan interceptor di OkHttpClient.Builder menentukan urutan eksekusinya: yang pertama ditambahkan dieksekusi pertama saat mengirim dan terakhir saat menerima.

Interceptor di OkHttp: Application dan Network

OkHttp membagi interceptor menjadi dua jenis. Application Interceptor (addInterceptor) dieksekusi antara kode aplikasi dan OkHttp: satu panggilan chain.proceed() — satu permintaan ke server, terlepas dari pengalihan. Network Interceptor (addNetworkInterceptor) dieksekusi di dalam OkHttp setelah pembentukan header dan koneksi — dipicu pada setiap pengalihan, percobaan ulang, atau autentikasi. Perbedaan ini sangat penting untuk memilih jenis interceptor yang tepat untuk tugas tertentu.

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

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

LoggingInterceptor — Application Interceptor yang mencatat metode, URL, kode respons, dan waktu eksekusi. Penambahan melalui addInterceptor() menjamin satu log per permintaan pengguna tanpa duplikasi pada pengalihan. CacheInterceptor ditambahkan sebagai Network Interceptor untuk memperhitungkan header Cache-Control server, yang hanya terlihat di dalam OkHttp setelah pembentukan permintaan HTTP.

Perbedaan antar jenis dalam praktik

Ketika aplikasi membuat permintaan, server dapat merespons dengan pengalihan 302 atau 301. Application Interceptor hanya melihat respons akhir setelah semua pengalihan — tidak tahu berapa banyak permintaan perantara yang dilakukan. Network Interceptor melihat setiap permintaan dan respons, termasuk yang perantara. Menurut data Square (2026), Network Interceptor juga melihat data yang dikompresi pada tingkat koneksi (gzip), sedangkan Application Interceptor menerima respons yang sudah didekompresi. Untuk menghitung jumlah panggilan jaringan yang sebenarnya, gunakan Network Interceptor.

Alamofire RequestInterceptor

Alamofire menyediakan protokol RequestInterceptor yang menggabungkan dua protokol: RequestAdapter untuk memodifikasi permintaan sebelum dikirim dan RequestRetrier untuk percobaan ulang saat kesalahan. Pemisahan ini memungkinkan kombinasi fleksibel antara adaptasi (penambahan header, token) dengan kebijakan percobaan ulang (penundaan eksponensial, batas percobaan, pemeriksaan jenis kesalahan). RequestInterceptor diimplementasikan oleh satu struktur atau kelas yang mengimplementasikan kedua protokol.

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 di Swift menambahkan token Bearer melalui adapt dan secara otomatis mengulang permintaan saat URLError (kehilangan jaringan, timeout) melalui retry dengan penundaan 1 detik. Pemisahan adaptasi dan percobaan ulang memungkinkan pengujian independen — seseorang dapat menulis unit test untuk adaptasi tanpa memengaruhi logika retry. Menurut data Alamofire (2026), RequestInterceptor adalah cara standar manajemen autentikasi terpusat di proyek iOS.

Skenario Penggunaan Interceptor

Pencatatan — skenario paling umum. Interceptor mencatat URL, metode, header, body permintaan dan respons, waktu eksekusi. Di build debug, ini menggantikan Charles Proxy dan Wireshark, di release — membantu laporan kesalahan dengan konteks permintaan. Untuk OkHttp gunakan HttpLoggingInterceptor dari pustaka logging-interceptor dengan level NONE, BASIC, HEADERS, dan BODY. Level BODY mencatat body lengkap permintaan dan respons — gunakan hanya di debug.

Autentikasi dan Refresh Token

Ketika access token kedaluwarsa, Interceptor mencegat respons 401, memanggil refresh token API, dan mengulang permintaan asli dengan token baru. Di OkHttp ini diimplementasikan melalui Authenticator atau Interceptor khusus dengan pemeriksaan response.code. Authenticator hanya memiliki akses ke header respons, Interceptor — ke body lengkap. Di Alamofire — melalui RequestRetrier yang mengembalikan .retry setelah token diperbarui. Menurut data OWASP (2026), pembaruan token otomatis melalui Interceptor mengurangi risiko kebocoran kredensial.

Penambahan header umum

Content-Type, Accept-Language, User-Agent, Device-ID — header yang diperlukan di setiap permintaan. Interceptor menambahkannya secara terpusat, tanpa duplikasi di setiap metode API. User-Agent dibentuk sekali saat aplikasi dimulai: “AppName/1.0 (Android 14; Pixel 8)”. Accept-Language diambil dari bahasa sistem perangkat. Menurut data Alamofire (2026), manajemen header terpusat melalui Interceptor mengurangi jumlah kesalahan header yang salah hingga 30%.

SkenarioOkHttpAlamofire
PencatatanHttpLoggingInterceptorEventMonitor
Auth tokenAuthenticator + InterceptorRequestInterceptor
HeaderaddInterceptorRequestAdapter
RetryInterceptor dengan pengulanganRequestRetrier
CachingCacheInterceptorCachedResponseHandler

Praktik Terbaik dan Urutan Rantai

Urutan penambahan Interceptor di OkHttp menentukan perilaku seluruh rantai. Interceptor pertama yang ditambahkan dieksekusi pertama saat mengirim permintaan dan terakhir saat menerima respons. Untuk pencatatan tambahkan Interceptor pertama — ia akan melihat permintaan akhir dengan semua modifikasi dari interceptor lain. Untuk kompresi — terakhir, agar kompresi diterapkan pada data akhir. Untuk autentikasi — sebelum percobaan ulang, agar token diperbarui sebelum percobaan ulang.

Rekomendasi untuk build production

Di build release, nonaktifkan pencatatan melalui BuildConfig.DEBUG atau injeksi ketergantungan. Gunakan addNetworkInterceptor untuk caching — Network Interceptor melihat header Cache-Control server dan menafsirkan kebijakan caching dengan benar. Untuk autentikasi terapkan addInterceptor (Application) — ini mencegah pencegat ulang pada pengalihan ke domain eksternal di mana header otorisasi tidak boleh dikirim. Uji setiap Interceptor secara terisolasi menggunakan MockWebServer dari okhttp-testing-support — ia mencegat permintaan dan mengembalikan respons yang sudah disiapkan, memungkinkan pemeriksaan logika interceptor tanpa server sungguhan.

Kinerja Interceptor

Setiap Interceptor menambahkan sedikit penundaan ke waktu permintaan. Dalam rantai tipikal 3–4 interceptor (pencatatan, autentikasi, kompresi, caching) overheadnya kurang dari 5 milidetik per permintaan. Masalah dimulai ketika Interceptor melakukan operasi pemblokiran: panggilan sinkron refresh token API, menulis log besar ke file, atau mengenkripsi body permintaan. Semua operasi ini harus asinkron atau dijalankan di thread latar belakang. Menurut data Square (2026), OkHttp menjalankan Interceptor di kumpulan thread Dispatcher — pemblokiran satu interceptor menunda seluruh rantai.

  • Urutan penting — pencatatan pertama, autentikasi sebelum percobaan ulang, kompresi terakhir
  • Debug vs Release — HttpLoggingInterceptor hanya di build debug
  • Isolasi — setiap Interceptor menyelesaikan satu tugas (Single Responsibility)
  • Asinkronisitas — Interceptor dijalankan di thread latar OkHttp, tidak memblokir UI

Pertanyaan yang Sering Diajukan

Apa perbedaan antara addInterceptor dan addNetworkInterceptor di OkHttp?

addInterceptor (Application) dijalankan sekali antara aplikasi dan OkHttp — tidak melihat pengalihan dan kompresi koneksi. addNetworkInterceptor (Network) dijalankan di dalam OkHttp pada setiap panggilan jaringan — melihat pengalihan, percobaan ulang, dan data setelah kompresi. Pilih Application untuk pencatatan dan autentikasi, Network — untuk caching.

Bagaimana Interceptor memperbarui token secara otomatis?

Interceptor memeriksa response.code == 401, memanggil refresh token API secara asinkron melalui Retrofit atau URLSession, menyimpan token baru, dan mengulang permintaan asli. Di OkHttp gunakan Authenticator untuk Basic Auth, Interceptor — untuk Bearer dengan pembaruan. Di Alamofire — retry dengan pemeriksaan jenis kesalahan.

Bisakah Interceptor memperlambat aplikasi?

Ya — operasi berat di Interceptor (mencatat body besar, enkripsi, panggilan API sinkron) meningkatkan waktu respons. Gunakan callback asinkron, batasi pencatatan hanya untuk build debug melalui BuildConfig.DEBUG, dan jangan lakukan operasi pemblokiran di metode intercept.

Apa itu Authenticator di OkHttp dan apa bedanya dengan Interceptor?

Authenticator — interceptor khusus untuk respons 401 yang mengimplementasikan Basic Auth atau Bearer token. Authenticator tidak memiliki akses ke body permintaan dan tidak dapat mengubah header sebelum dikirim — hanya dapat memproses respons dengan kesalahan otorisasi. Interceptor, sebaliknya, dapat memodifikasi permintaan di tahap eksekusi mana pun.

Bagaimana cara menambahkan Interceptor yang sama ke semua permintaan?

Di OkHttp berikan Interceptor ke OkHttpClient.Builder — semua permintaan dari klien ini melewatinya. Di Alamofire tambahkan RequestInterceptor ke konfigurasi Session. Jika Anda menggunakan beberapa klien (misalnya untuk API berbeda), buat Builder dasar dengan interceptor umum melalui pola Builder.

Ringkasan

  • Interceptor — mekanisme pencegat permintaan dan respons HTTP berdasarkan pola Chain of Responsibility.
  • OkHttp menawarkan dua jenis: Application (satu panggilan per permintaan) dan Network (pada setiap pengalihan dan percobaan ulang).
  • Alamofire memisahkan adaptasi (RequestAdapter) dan percobaan ulang (RequestRetrier) dalam satu RequestInterceptor.
  • Skenario utama — pencatatan, autentikasi, header, percobaan ulang, dan caching respons HTTP.
  • Urutan penambahan Interceptor di Builder menentukan urutan: pencatatan — pertama, kompresi — terakhir.
  • Build production memerlukan penonaktifan pencatatan debug melalui flag BuildConfig dan injeksi DI.
  • Rantai interceptor yang dikonfigurasi dengan benar mengurangi waktu debugging masalah jaringan hingga 40% dan menstandarkan penanganan kesalahan.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga