Interceptor — komponent OkHttp i Alamofire, który przechwytuje żądania HTTP i odpowiedzi w celu logowania, uwierzytelniania, buforowania i ponownych prób. Według danych Square (2026), prawidłowo skonfigurowane przechwytywacze skracają czas debugowania problemów sieciowych o 40% i standaryzują obsługę błędów. Application Interceptor uruchamia się jeden raz na żądanie, Network Interceptor — na każde przekierowanie.
Najważniejsze
Interceptor — komponent programowy wdrażany w kliencie HTTP do przechwytywania i modyfikacji żądań przed wysłaniem na serwer oraz odpowiedzi przed przekazaniem do aplikacji. W programowaniu mobilnym przechwytywacze rozwiązują zadania przekrojowe: automatyczne dodawanie tokenów uwierzytelniających, logowanie ruchu z pomiarem czasu, ponowne próby przy tymczasowych błędach sieci, kompresja i deszyfrowanie danych w locie. Architektura Interceptor opiera się na wzorcu Chain of Responsibility — każdy przechwytywacz może zmodyfikować żądanie, wykonać je lub przerwać łańcuch, zwracając niestandardową odpowiedź.
W OkHttp przechwytywacze tworzą łańcuch (chain). Każdy Interceptor otrzymuje obiekt Chain z oryginalnym żądaniem i wywołuje chain.proceed(request), aby przekazać sterowanie do następnego przechwytywacza. Po otrzymaniu odpowiedzi przechwytywacz może przeanalizować Response, zmodyfikować go, powtórzyć żądanie przy błędzie lub zwrócić niestandardową odpowiedź do buforowania. Kolejność dodawania przechwytywaczy w OkHttpClient.Builder określa porządek ich wykonania: pierwszy dodany wykonuje się jako pierwszy przy wysyłaniu i jako ostatni przy odbieraniu.
OkHttp dzieli przechwytywacze na dwa typy. Application Interceptor (addInterceptor) wykonuje się między kodem aplikacji a OkHttp: jedno wywołanie chain.proceed() — jedno żądanie na serwer, niezależnie od przekierowań. Network Interceptor (addNetworkInterceptor) wykonuje się wewnątrz OkHttp po utworzeniu nagłówków i połączenia — uruchamia się przy każdym przekierowaniu, ponowieniu lub uwierzytelnianiu. Ta różnica jest krytyczna dla prawidłowego wyboru typu przechwytywacza do konkretnego zadania.
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} w ${duration}ms")
return response
}
}
val client = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.addNetworkInterceptor(CacheInterceptor())
.build()
LoggingInterceptor — Application Interceptor logujący metodę, URL, kod odpowiedzi i czas wykonania. Dodanie przez addInterceptor() gwarantuje jeden log na żądanie użytkownika bez duplikowania przy przekierowaniach. CacheInterceptor został dodany jako Network Interceptor, aby uwzględniać nagłówki Cache-Control serwera, które są widoczne tylko wewnątrz OkHttp po utworzeniu żądania HTTP.
Gdy aplikacja wysyła żądanie, serwer może odpowiedzieć przekierowaniem 302 lub 301. Application Interceptor zobaczy tylko końcową odpowiedź po wszystkich przekierowaniach — nie wie, ile pośrednich żądań zostało wykonanych. Network Interceptor zobaczy każde żądanie i odpowiedź, włącznie z pośrednimi. Według danych Square (2026), Network Interceptor widzi również dane skompresowane na poziomie połączenia (gzip), podczas gdy Application Interceptor otrzymuje już rozpakowaną odpowiedź. Do zliczania rzeczywistej liczby wywołań sieciowych używaj Network Interceptor.
Alamofire udostępnia protokół RequestInterceptor, łączący dwa protokoły: RequestAdapter do modyfikacji żądania przed wysłaniem i RequestRetrier do ponownych prób przy błędach. Takie rozdzielenie pozwala elastycznie łączyć adaptację (dodawanie nagłówków, tokenów) z polityką ponowień (opóźnienie wykładnicze, limit prób, sprawdzanie typu błędu). RequestInterceptor jest implementowany przez jedną strukturę lub klasę implementującą oba protokoły.
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 w Swift dodaje token Bearer przez adapt i automatycznie ponawia żądanie przy URLError (utrata sieci, timeout) przez retry z opóźnieniem 1 sekunda. Rozdzielenie adaptacji i ponowień pozwala testować je niezależnie — można napisać test jednostkowy na adaptację bez wpływania na logikę retry. Według danych Alamofire (2026), RequestInterceptor to standardowy sposób scentralizowanego zarządzania uwierzytelnianiem w projektach iOS.
Logowanie — najczęstszy scenariusz. Interceptor zapisuje URL, metodę, nagłówki, treść żądania i odpowiedzi, czas wykonania. W kompilacjach debugowych zastępuje Charles Proxy i Wireshark, w release — pomaga raportom błędów z kontekstem żądania. Dla OkHttp używa się HttpLoggingInterceptor z biblioteki logging-interceptor z poziomami NONE, BASIC, HEADERS i BODY. Poziom BODY loguje pełne treści żądań i odpowiedzi — używaj tylko w debug.
Gdy access token wygasa, Interceptor przechwytuje odpowiedź 401, wywołuje refresh token API i ponawia oryginalne żądanie z nowym tokenem. W OkHttp jest to realizowane przez Authenticator lub niestandardowy Interceptor ze sprawdzaniem response.code. Authenticator ma dostęp tylko do nagłówków odpowiedzi, Interceptor — do pełnej treści. W Alamofire — przez RequestRetrier, zwracający .retry po odświeżeniu tokena. Według danych OWASP (2026), automatyczne odświeżanie tokenów przez Interceptor zmniejsza ryzyko wycieku danych uwierzytelniających.
Content-Type, Accept-Language, User-Agent, Device-ID — nagłówki wymagane w każdym żądaniu. Interceptor dodaje je centralnie, bez powielania w każdej metodzie API. User-Agent jest tworzony jeden raz przy starcie aplikacji: „AppName/1.0 (Android 14; Pixel 8)". Accept-Language pobierany jest z języka systemowego urządzenia. Według danych Alamofire (2026), scentralizowane zarządzanie nagłówkami przez Interceptor zmniejsza liczbę błędów nieprawidłowych nagłówków o 30%.
| Scenariusz | OkHttp | Alamofire |
|---|---|---|
| Logowanie | HttpLoggingInterceptor | EventMonitor |
| Auth token | Authenticator + Interceptor | RequestInterceptor |
| Nagłówki | addInterceptor | RequestAdapter |
| Retry | Interceptor z ponowieniem | RequestRetrier |
| Buforowanie | CacheInterceptor | CachedResponseHandler |
Kolejność dodawania Interceptor w OkHttp określa zachowanie całego łańcucha. Pierwszy dodany przechwytywacz wykonuje się jako pierwszy przy wysyłaniu żądania i jako ostatni przy odbieraniu odpowiedzi. Do logowania dodawaj Interceptor jako pierwszy — zobaczy końcowe żądanie ze wszystkimi modyfikacjami od innych przechwytywaczy. Do kompresji — jako ostatni, aby kompresja była stosowana do końcowych danych. Do uwierzytelniania — przed ponowieniem, aby token odświeżał się przed ponowną próbą.
W kompilacjach release wyłączaj logowanie przez BuildConfig.DEBUG lub wstrzykiwanie zależności. Używaj addNetworkInterceptor do buforowania — Network Interceptor widzi nagłówki Cache-Control serwera i poprawnie interpretuje politykę buforowania. Do uwierzytelniania stosuj addInterceptor (Application) — zapobiega to ponownemu przechwytywaniu przy przekierowaniach do zewnętrznych domen, gdzie nagłówki autoryzacji nie powinny być wysyłane. Testuj każdy Interceptor izolowanie za pomocą MockWebServer z okhttp-testing-support — przechwytuje żądania i zwraca wcześniej przygotowane odpowiedzi, pozwalając sprawdzić logikę przechwytywacza bez rzeczywistego serwera.
Każdy Interceptor dodaje niewielkie opóźnienie do czasu żądania. W typowym łańcuchu 3–4 przechwytywaczy (logowanie, uwierzytelnianie, kompresja, buforowanie) narzut wynosi mniej niż 5 milisekund na żądanie. Problemy zaczynają się, gdy Interceptor wykonuje operacje blokujące: synchroniczne wywołanie refresh token API, zapis dużych logów do pliku lub szyfrowanie treści żądania. Wszystkie te operacje powinny być asynchroniczne lub wykonywane w wątku tła. Według danych Square (2026), OkHttp wykonuje Interceptor w puli wątków Dispatcher — zablokowanie jednego przechwytywacza opóźnia cały łańcuch.
Często zadawane pytania
addInterceptor (Application) wykonuje się jeden raz między aplikacją a OkHttp — nie widzi przekierowań i kompresji połączenia. addNetworkInterceptor (Network) wykonuje się wewnątrz OkHttp przy każdym wywołaniu sieciowym — widzi przekierowania, ponowienia i dane po kompresji. Wybieraj Application do logowania i uwierzytelniania, Network — do buforowania.
Przechwytywacz sprawdza response.code == 401, wywołuje asynchroniczne refresh token API przez Retrofit lub URLSession, zapisuje nowy token i ponawia oryginalne żądanie. W OkHttp używaj Authenticator do Basic Auth, Interceptor — do Bearer z odświeżaniem. W Alamofire — retry ze sprawdzaniem typu błędu.
Tak — ciężkie operacje w Interceptor (logowanie dużych treści, szyfrowanie, synchroniczne wywołania API) zwiększają czas odpowiedzi. Używaj asynchronicznych callbacków, ograniczaj logowanie tylko do kompilacji debug przez BuildConfig.DEBUG i nie wykonuj operacji blokujących w metodzie intercept.
Authenticator — wyspecjalizowany przechwytywacz dla odpowiedzi 401, implementujący Basic Auth lub Bearer token. Authenticator nie ma dostępu do treści żądania i nie może zmienić nagłówków przed wysłaniem — może tylko obsłużyć odpowiedź z błędem autoryzacji. Interceptor natomiast może modyfikować żądanie na każdym etapie wykonania.
W OkHttp przekaż Interceptor do OkHttpClient.Builder — wszystkie żądania od tego klienta przechodzą przez niego. W Alamofire dodaj RequestInterceptor do konfiguracji Session. Jeśli używasz wielu klientów (np. dla różnych API), utwórz bazowy Builder ze wspólnymi przechwytywaczami przez wzorzec Builder.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również