Interceptor — στοιχείο OkHttp και Alamofire που παρεμβαίνει σε αιτήματα και αποκρίσεις HTTP για καταγραφή, έλεγχο ταυτότητας, προσωρινή αποθήκευση και επαναλήψεις. Σύμφωνα με στοιχεία της Square (2026), οι σωστά ρυθμισμένοι παρεμβολείς μειώνουν τον χρόνο εντοπισμού σφαλμάτων δικτύου κατά 40% και τυποποιούν τον χειρισμό σφαλμάτων. Application Interceptor ενεργοποιείται μία φορά ανά αίτημα, Network Interceptor — σε κάθε ανακατεύθυνση.
Κύρια σημεία
Interceptor — στοιχείο λογισμικού που εισάγεται στον πελάτη HTTP για παρεμβολή και τροποποίηση αιτημάτων πριν από την αποστολή στον διακομιστή και αποκρίσεων πριν από τη μεταφορά στην εφαρμογή. Στην κινητή ανάπτυξη, οι παρεμβολείς λύνουν διατομεακές εργασίες: αυτόματη προσθήκη κουπονιών ελέγχου ταυτότητας, καταγραφή κίνησης με μέτρηση χρόνου, επαναλήψεις σε προσωρινά σφάλματα δικτύου, συμπίεση και αποκρυπτογράφηση δεδομένων εν κινήσει. Η αρχιτεκτονική Interceptor βασίζεται στο μοτίβο Chain of Responsibility — κάθε παρεμβολέας μπορεί να τροποποιήσει το αίτημα, να το εκτελέσει ή να διακόψει την αλυσίδα επιστρέφοντας μια προσαρμοσμένη απόκριση.
Στο OkHttp, οι παρεμβολείς σχηματίζουν μια αλυσίδα (chain). Κάθε Interceptor λαμβάνει ένα αντικείμενο Chain με το αρχικό αίτημα και καλεί το chain.proceed(request) για να μεταβιβάσει τον έλεγχο στον επόμενο παρεμβολέα. Μετά τη λήψη της απόκρισης, ο παρεμβολέας μπορεί να αναλύσει το Response, να το τροποποιήσει, να επαναλάβει το αίτημα σε σφάλμα ή να επιστρέψει μια προσαρμοσμένη απόκριση για προσωρινή αποθήκευση. Η σειρά προσθήκης παρεμβολέων στο OkHttpClient.Builder καθορίζει τη σειρά εκτέλεσής τους: ο πρώτος που προστίθεται εκτελείται πρώτος κατά την αποστολή και τελευταίος κατά τη λήψη.
OkHttp χωρίζει τους παρεμβολείς σε δύο τύπους. Application Interceptor (addInterceptor) εκτελείται μεταξύ του κώδικα εφαρμογής και OkHttp: μία κλήση chain.proceed() — ένα αίτημα στον διακομιστή, ανεξάρτητα από ανακατευθύνσεις. Network Interceptor (addNetworkInterceptor) εκτελείται εντός OkHttp μετά τον σχηματισμό κεφαλίδων και σύνδεσης — ενεργοποιείται σε κάθε ανακατεύθυνση, επανάληψη ή έλεγχο ταυτότητας. Αυτή η διαφορά είναι κρίσιμη για τη σωστή επιλογή τύπου παρεμβολέα για μια συγκεκριμένη εργασία.
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")
return response
}
}
val client = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.addNetworkInterceptor(CacheInterceptor())
.build()
LoggingInterceptor — Application Interceptor που καταγράφει τη μέθοδο, URL, κωδικό απόκρισης και χρόνο εκτέλεσης. Η προσθήκη μέσω addInterceptor() εγγυάται ένα αρχείο καταγραφής ανά αίτημα χρήστη χωρίς διπλασιασμό σε ανακατευθύνσεις. CacheInterceptor προστέθηκε ως Network Interceptor για να λαμβάνει υπόψη τις κεφαλίδες Cache-Control του διακομιστή, οι οποίες είναι ορατές μόνο εντός OkHttp μετά τον σχηματισμό του αιτήματος HTTP.
Όταν η εφαρμογή κάνει ένα αίτημα, ο διακομιστής μπορεί να απαντήσει με ανακατεύθυνση 302 ή 301. Application Interceptor θα δει μόνο την τελική απόκριση μετά από όλες τις ανακατευθύνσεις — δεν γνωρίζει πόσα ενδιάμεσα αιτήματα έγιναν. Network Interceptor θα δει κάθε αίτημα και απόκριση, συμπεριλαμβανομένων των ενδιάμεσων. Σύμφωνα με στοιχεία της Square (2026), το Network Interceptor βλέπει επίσης δεδομένα συμπιεσμένα σε επίπεδο σύνδεσης (gzip), ενώ το Application Interceptor λαμβάνει ήδη αποσυμπιεσμένη απόκριση. Για την καταμέτρηση του πραγματικού αριθμού κλήσεων δικτύου, χρησιμοποιήστε το Network Interceptor.
Alamofire παρέχει το πρωτόκολλο RequestInterceptor, που συνδυάζει δύο πρωτόκολλα: RequestAdapter για τροποποίηση του αιτήματος πριν από την αποστολή και RequestRetrier για επαναλήψεις σε σφάλματα. Αυτός ο διαχωρισμός επιτρέπει τον ευέλικτο συνδυασμό της προσαρμογής (προσθήκη κεφαλίδων, κουπονιών) με την πολιτική επαναλήψεων (εκθετική καθυστέρηση, όριο προσπαθειών, έλεγχος τύπου σφάλματος). Το RequestInterceptor υλοποιείται από μία δομή ή κλάση που υλοποιεί και τα δύο πρωτόκολλα.
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 προσθέτει κουπόνι Bearer μέσω adapt και επαναλαμβάνει αυτόματα το αίτημα σε URLError (απώλεια δικτύου, timeout) μέσω retry με καθυστέρηση 1 δευτερολέπτου. Ο διαχωρισμός της προσαρμογής και των επαναλήψεων επιτρέπει την ανεξάρτητη δοκιμή τους — μπορεί να γραφτεί unit test για την προσαρμογή χωρίς να επηρεάζεται η λογική retry. Σύμφωνα με στοιχεία του Alamofire (2026), το RequestInterceptor είναι ο τυπικός τρόπος κεντρικής διαχείρισης ελέγχου ταυτότητας σε έργα iOS.
Καταγραφή — το πιο συνηθισμένο σενάριο. Το Interceptor καταγράφει URL, μέθοδο, κεφαλίδες, σώμα αιτήματος και απόκρισης, χρόνο εκτέλεσης. Σε debug εκδόσεις, αυτό αντικαθιστά τα Charles Proxy και Wireshark, σε release — βοηθά αναφορές σφαλμάτων με περιβάλλον αιτήματος. Για OkHttp χρησιμοποιείται το HttpLoggingInterceptor από τη βιβλιοθήκη logging-interceptor με επίπεδα NONE, BASIC, HEADERS και BODY. Το επίπεδο BODY καταγράφει πλήρη σώματα αιτημάτων και αποκρίσεων — χρησιμοποιήστε μόνο σε debug.
Όταν το κουπόνι πρόσβασης λήγει, το Interceptor παρεμβαίνει στην απόκριση 401, καλεί το refresh token API και επαναλαμβάνει το αρχικό αίτημα με το νέο κουπόνι. Στο OkHttp αυτό υλοποιείται μέσω Authenticator ή προσαρμοσμένου Interceptor με έλεγχο response.code. Το Authenticator έχει πρόσβαση μόνο στις κεφαλίδες απόκρισης, το Interceptor — στο πλήρες σώμα. Στο Alamofire — μέσω RequestRetrier που επιστρέφει .retry μετά την ανανέωση κουπονιού. Σύμφωνα με στοιχεία του OWASP (2026), η αυτόματη ανανέωση κουπονιών μέσω Interceptor μειώνει τον κίνδυνο διαρροής διαπιστευτηρίων.
Content-Type, Accept-Language, User-Agent, Device-ID — κεφαλίδες που απαιτούνται σε κάθε αίτημα. Το Interceptor τις προσθέτει κεντρικά, χωρίς διπλασιασμό σε κάθε μέθοδο API. Το User-Agent σχηματίζεται μία φορά κατά την εκκίνηση της εφαρμογής: “AppName/1.0 (Android 14; Pixel 8)”. Το Accept-Language λαμβάνεται από τη γλώσσα συστήματος της συσκευής. Σύμφωνα με στοιχεία του Alamofire (2026), η κεντρική διαχείριση κεφαλίδων μέσω Interceptor μειώνει τον αριθμό σφαλμάτων λανθασμένων κεφαλίδων κατά 30%.
| Σενάριο | OkHttp | Alamofire |
|---|---|---|
| Καταγραφή | HttpLoggingInterceptor | EventMonitor |
| Auth token | Authenticator + Interceptor | RequestInterceptor |
| Κεφαλίδες | addInterceptor | RequestAdapter |
| Retry | Interceptor με επανάληψη | RequestRetrier |
| Προσωρινή αποθήκευση | CacheInterceptor | CachedResponseHandler |
Η σειρά προσθήκης Interceptor στο OkHttp καθορίζει τη συμπεριφορά ολόκληρης της αλυσίδας. Ο πρώτος παρεμβολέας που προστίθεται εκτελείται πρώτος κατά την αποστολή αιτήματος και τελευταίος κατά τη λήψη απόκρισης. Για καταγραφή προσθέστε το Interceptor πρώτο — θα δει το τελικό αίτημα με όλες τις τροποποιήσεις από άλλους παρεμβολείς. Για συμπίεση — τελευταίο, ώστε η συμπίεση να εφαρμόζεται στα τελικά δεδομένα. Για έλεγχο ταυτότητας — πριν από την επανάληψη, ώστε το κουπόνι να ανανεώνεται πριν από την επανάληψη.
Σε εκδόσεις release, απενεργοποιήστε την καταγραφή μέσω BuildConfig.DEBUG ή έγχυσης εξαρτήσεων. Χρησιμοποιήστε addNetworkInterceptor για προσωρινή αποθήκευση — το Network Interceptor βλέπει τις κεφαλίδες Cache-Control του διακομιστή και ερμηνεύει σωστά την πολιτική προσωρινής αποθήκευσης. Για έλεγχο ταυτότητας εφαρμόστε addInterceptor (Application) — αυτό αποτρέπει την εκ νέου παρεμβολή σε ανακατευθύνσεις προς εξωτερικούς τομείς όπου οι κεφαλίδες εξουσιοδότησης δεν πρέπει να αποστέλλονται. Δοκιμάστε κάθε Interceptor μεμονωμένα χρησιμοποιώντας MockWebServer από το okhttp-testing-support — παρεμβαίνει σε αιτήματα και επιστρέφει προετοιμασμένες αποκρίσεις, επιτρέποντας τον έλεγχο της λογικής παρεμβολέα χωρίς πραγματικό διακομιστή.
Κάθε Interceptor προσθέτει μια μικρή καθυστέρηση στον χρόνο αιτήματος. Σε μια τυπική αλυσίδα 3–4 παρεμβολέων (καταγραφή, έλεγχος ταυτότητας, συμπίεση, προσωρινή αποθήκευση) η επιβάρυνση είναι μικρότερη από 5 χιλιοστά του δευτερολέπτου ανά αίτημα. Τα προβλήματα αρχίζουν όταν το Interceptor εκτελεί λειτουργίες αποκλεισμού: σύγχρονη κλήση refresh token API, εγγραφή μεγάλων αρχείων καταγραφής σε αρχείο ή κρυπτογράφηση σώματος αιτήματος. Όλες αυτές οι λειτουργίες πρέπει να είναι ασύγχρονες ή να εκτελούνται σε νήμα παρασκηνίου. Σύμφωνα με στοιχεία της Square (2026), το OkHttp εκτελεί το Interceptor στη δεξαμενή νημάτων Dispatcher — το μπλοκάρισμα ενός παρεμβολέα καθυστερεί ολόκληρη την αλυσίδα.
Συχνές Ερωτήσεις
addInterceptor (Application) εκτελείται μία φορά μεταξύ εφαρμογής και OkHttp — δεν βλέπει ανακατευθύνσεις και συμπίεση σύνδεσης. addNetworkInterceptor (Network) εκτελείται εντός OkHttp σε κάθε κλήση δικτύου — βλέπει ανακατευθύνσεις, επαναλήψεις και δεδομένα μετά από συμπίεση. Επιλέξτε Application για καταγραφή και έλεγχο ταυτότητας, Network — για προσωρινή αποθήκευση.
Ο παρεμβολέας ελέγχει response.code == 401, καλεί ασύγχρονα το refresh token API μέσω Retrofit ή URLSession, αποθηκεύει το νέο κουπόνι και επαναλαμβάνει το αρχικό αίτημα. Στο OkHttp χρησιμοποιήστε Authenticator για Basic Auth, Interceptor — για Bearer με ανανέωση. Στο Alamofire — retry με έλεγχο τύπου σφάλματος.
Ναι — βαριές λειτουργίες στο Interceptor (καταγραφή μεγάλων σωμάτων, κρυπτογράφηση, σύγχρονες κλήσεις API) αυξάνουν τον χρόνο απόκρισης. Χρησιμοποιήστε ασύγχρονες κλήσεις επιστροφής, περιορίστε την καταγραφή μόνο σε debug εκδόσεις μέσω BuildConfig.DEBUG και μην εκτελείτε λειτουργίες αποκλεισμού στη μέθοδο intercept.
Authenticator — εξειδικευμένος παρεμβολέας για αποκρίσεις 401 που υλοποιεί Basic Auth ή Bearer κουπόνι. Το Authenticator δεν έχει πρόσβαση στο σώμα αιτήματος και δεν μπορεί να τροποποιήσει κεφαλίδες πριν από την αποστολή — μπορεί μόνο να επεξεργαστεί την απόκριση με σφάλμα εξουσιοδότησης. Το Interceptor, αντίθετα, μπορεί να τροποποιήσει το αίτημα σε οποιοδήποτε στάδιο εκτέλεσης.
Στο OkHttp μεταβιβάστε το Interceptor στο OkHttpClient.Builder — όλα τα αιτήματα από αυτόν τον πελάτη περνούν μέσω αυτού. Στο Alamofire προσθέστε το RequestInterceptor στη διαμόρφωση Session. Εάν χρησιμοποιείτε πολλούς πελάτες (π.χ. για διαφορετικά API), δημιουργήστε ένα βασικό Builder με κοινούς παρεμβολείς μέσω του μοτίβου Builder.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης