OkHttp — τι είναι, δυνατότητες και αρχιτεκτονική του HTTP-πελάτη

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-07 Χρόνος ανάγνωσης: 8 λεπ

Το OkHttp είναι ένας υψηλής απόδοσης HTTP-πελάτης για Android και Kotlin, που αναπτύχθηκε από την εταιρεία Square ως βάση για το Retrofit και άλλες βιβλιοθήκες δικτύου. Παρέχει αποτελεσματική διαχείριση συνδέσεων, ενσωματωμένη προσωρινή αποθήκευση και υποστήριξη για HTTP/2. Σύμφωνα με τα δεδομένα Square, 2025, το OkHttp επεξεργάζεται δισεκατομμύρια αιτήματα καθημερινά σε εφαρμογές σε όλο τον κόσμο.

Κύρια σημεία

  • OkHttp — HTTP-πελάτης για Android και Kotlin από την Square με υποστήριξη HTTP/2 και SPDY
  • Δεξαμενή συνδέσεων — μηχανισμός επαναχρησιμοποίησης TCP συνδέσεων για μείωση καθυστερήσεων
  • Παρεμβολείς Interceptor και NetworkInterceptor τροποποιούν αιτήματα και αποκρίσεις
  • Προσωρινή αποθήκευση — ενσωματωμένη Cache μειώνει την κίνηση σε επαναλαμβανόμενα αιτήματα
  • WebSocket — υποστήριξη αμφίδρομης επικοινωνίας μέσω πρωτοκόλλου WebSocket

Τι είναι το OkHttp;

OkHttp είναι ένας αποτελεσματικός HTTP-πελάτης για Java, Android και Kotlin, που αναπτύχθηκε από την Square. Η βιβλιοθήκη παρέχει ένα χαμηλού επιπέδου API για την εκτέλεση HTTP αιτημάτων με υποστήριξη για HTTP/2, SPDY, WebSocket και αυτόματη αποκατάσταση συνδέσεων σε περίπτωση αποτυχιών δικτύου.

Το OkHttp εμφανίστηκε το 2013 ως απάντηση στην ανάγκη για έναν αξιόπιστο HTTP-πελάτη που θα έλυνε τα προβλήματα του HttpURLConnection — έλλειψη δεξαμενής συνδέσεων, αδύναμη υποστήριξη για HTTP/2 και μη βολικό API. Μέχρι το 2025, το OkHttp χρησιμοποιείται σε επίπεδο συστήματος Android API: το OkHttp είναι ενσωματωμένο στην υλοποίηση του HttpURLConnection από το Android 4.4 (API 19).

Σύμφωνα με τα δεδομένα Google I/O 2024, το OkHttp επεξεργάζεται πάνω από το 70% όλων των HTTP αιτημάτων στο οικοσύστημα Android. Αυτό είναι δυνατό επειδή το OkHttp αποτελεί το επίπεδο μεταφοράς για Retrofit, Apollo GraphQL, Firebase και πολλές άλλες βιβλιοθήκες. Οι προγραμματιστές λαμβάνουν αυτόματα τη λειτουργικότητα του OkHttp χωρίς να το συνδέουν ρητά.

Πώς λειτουργεί το OkHttp

Η αρχιτεκτονική του OkHttp βασίζεται σε μια αλυσίδα παρεμβολέων (Interceptor chain). Κάθε αίτημα περνά από μια ακολουθία παρεμβολέων που μπορούν να τροποποιήσουν το Request, το Response ή να διακόψουν την εκτέλεση. Αυτή η αρχιτεκτονική θυμίζει το μοτίβο Chain of Responsibility και επιτρέπει την ευέλικτη επέκταση της λειτουργικότητας.

Όταν η εφαρμογή στέλνει ένα αίτημα, το OkHttp εκτελεί τα ακόλουθα βήματα: επιλύει το DNS, επιλέγει μια σύνδεση από τη δεξαμενή (ή δημιουργεί μια νέα), ανοίγει τη χειραψία TLS (αν είναι HTTPS), στέλνει το HTTP αίτημα, λαμβάνει την απόκριση και την επιστρέφει στην εφαρμογή. Το RealCall είναι μια εσωτερική κλάση που διαχειρίζεται τον πλήρη κύκλο ζωής του αιτήματος από τη δημιουργία έως την ολοκλήρωση.

Το OkHttp χειρίζεται αυτόματα τις ανακατευθύνσεις (302, 301), επαναλαμβάνει αιτήματα σε αποτυχίες δικτύου (retry), ακολουθεί το πρωτόκολλο keep-alive και υποστηρίζει τη διαφανή συμπίεση gzip. Ο προγραμματιστής δεν χρειάζεται να γράψει κώδικα για αυτές τις λειτουργίες — το OkHttp τις εκτελεί αυτόματα βάσει των κεφαλίδων του διακομιστή.

Υποστήριξη HTTP/2 και πολυπλεξία

HTTP/2 επιτρέπει την αποστολή πολλαπλών αιτημάτων μέσω μιας TCP σύνδεσης ταυτόχρονα, χωρίς αποκλεισμό (head-of-line blocking, χαρακτηριστικό του HTTP/1.1). Το OkHttp χρησιμοποιεί αυτόματα HTTP/2 εάν ο διακομιστής υποστηρίζει αυτό το πρωτόκολλο και μεταβαίνει διαφανώς σε HTTP/1.1 όταν είναι απαραίτητο.

Η πολυπλεξία HTTP/2 είναι ιδιαίτερα σημαντική για εφαρμογές κινητών, όπου η καθυστέρηση δημιουργίας σύνδεσης (TCP + TLS) μπορεί να είναι 100–300 ms. Αντί για 10 διαδοχικές συνδέσεις, το OkHttp χρησιμοποιεί μία, μειώνοντας τη συνολική καθυστέρηση κατά 40–60% σε τυπικές συσκευές Android με ασταθή σύνδεση.

Παρεμβολείς OkHttp: Interceptor και NetworkInterceptor

Interceptor είναι μια διεπαφή με μία μόνο μέθοδο intercept(Chain) που λαμβάνει Request, εκτελεί ενέργειες και επιστρέφει Response. Οι παρεμβολείς είναι δύο τύπων: παρεμβολείς εφαρμογής (προστίθενται μέσω addInterceptor) και παρεμβολείς δικτύου (addNetworkInterceptor).

Οι παρεμβολείς εφαρμογής ενεργοποιούνται πριν από τη διαμόρφωση του HTTP αιτήματος — βλέπουν το αρχικό Request και το τελικό Response μετά από όλους τους μετασχηματισμούς. Οι παρεμβολείς δικτύου ενεργοποιούνται σε επίπεδο δικτύου: βλέπουν το αίτημα μετά τη συμπίεση gzip, την προσθήκη κεφαλίδων Content-Length, τις ανακατευθύνσεις και τις επαναλήψεις. Οι παρεμβολείς δικτύου δεν καλούνται εάν η απόκριση προέρχεται από την προσωρινή αποθήκευση.

Τύπος παρεμβολέαΜέθοδος προσθήκηςΠότε καλείταιΒλέπει προσωρινή αποθήκευση
Application InterceptoraddInterceptor()Πριν και μετά το αίτημαΝαι
Network InterceptoraddNetworkInterceptor()Σε επίπεδο δικτύουΌχι

Εφαρμογή παρεμβολέων στην πράξη

Στην πράξη, οι παρεμβολείς OkHttp λύνουν τρεις κύριες εργασίες: εξουσιοδότηση (προσθήκη κεφαλίδας Authorization), καταγραφή (HttpLoggingInterceptor για αποσφαλμάτωση) και επανάληψη (αυτόματη επανάληψη αιτήματος σε αποτυχίες δικτύου). Συνδυάζοντας πολλούς παρεμβολείς, μπορεί να δημιουργηθεί ένας πλήρης αγωγός επεξεργασίας αιτήματος χωρίς διπλασιασμό κώδικα σε κάθε HTTP κλήση της εφαρμογής.

Η σειρά προσθήκης παρεμβολέων έχει σημασία: ο Interceptor που προστίθεται πρώτος εκτελείται πρώτος στην είσοδο και τελευταίος στην έξοδο. Για το NetworkInterceptor, η σειρά καθορίζεται από τη στοίβα δικτύου. Συνιστώμενη σειρά: AuthInterceptor (προσθέτει το διακριτικό), LoggingInterceptor (καταγράφει το αίτημα), RetryInterceptor (επαναλαμβάνει σε αποτυχίες).

Καταγραφή μέσω HttpLoggingInterceptor

Για την αποσφαλμάτωση αιτημάτων δικτύου χρησιμοποιείται το HttpLoggingInterceptor — ένας έτοιμος παρεμβολέας από την Square. Καταγράφει τη μέθοδο, το URL, τις κεφαλίδες και το σώμα του αιτήματος και της απόκρισης. Επίπεδα καταγραφής: BASIC (μέθοδος + URL + κωδικός), HEADERS (με κεφαλίδες) και BODY (πλήρες αίτημα και απόκριση). Το BODY είναι χρήσιμο κατά την ανάπτυξη, αλλά στην παραγωγή απενεργοποιείται για λόγους ασφαλείας και απόδοσης.

Παραδείγματα κώδικα OkHttp σε Kotlin

Ας εξετάσουμε ένα βασικό GET αίτημα μέσω OkHttp. Πρώτα δημιουργείται το OkHttpClient — ένα βαρύ αντικείμενο που δημιουργείται μία φορά και επαναχρησιμοποιείται. Στη συνέχεια σχηματίζεται ένα Request με URL, και το αίτημα εκτελείται σύγχρονα μέσω execute ή ασύγχρονα μέσω enqueue.

kotlin
val client = OkHttpClient.Builder()
    .connectTimeout(15, TimeUnit.SECONDS)
    .readTimeout(15, TimeUnit.SECONDS)
    .build()

val request = Request.Builder()
    .url("https://api.github.com/users/octocat")
    .header("Accept", "application/vnd.github.v3+json")
    .build()

val response = client.newCall(request).execute()
println(response.body()?.string())

Για ασύγχρονη εκτέλεση χρησιμοποιείται η μέθοδος enqueue, η οποία δέχεται ένα Callback. Το OkHttp εκτελεί το αίτημα σε ένα νήμα παρασκηνίου και επιστρέφει το αποτέλεσμα στο callback στο ίδιο νήμα. Για εναλλαγή στο κύριο νήμα Android, χρησιμοποιήστε Handler ή coroutines.

kotlin
client.newCall(request).enqueue(object : Callback {
    override fun onFailure(
        call: Call, e: IOException
    ) {
        println("Το αίτημα απέτυχε: ${e.message}")
    }

    override fun onResponse(
        call: Call, response: Response
    ) {
        println(response.body()?.string())
    }
})

Προσθήκη παρεμβολέα για εξουσιοδότηση

Ένας προσαρμοσμένος Interceptor προσθέτει ένα Bearer διακριτικό σε κάθε αίτημα. Ο παρεμβολέας ελέγχει την παρουσία της κεφαλίδας Authorization και, εάν το διακριτικό δεν έχει οριστεί ακόμα, το προσθέτει από τον αποθηκευτικό χώρο. Σε απόκριση 401, ο παρεμβολέας μπορεί να ενημερώσει το διακριτικό μέσω Authenticator.

kotlin
class AuthInterceptor(
    private val tokenProvider: () -> String?
) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalRequest = chain.request()
        val token = tokenProvider.invoke()
        val request = originalRequest.newBuilder()
            .header("Authorization", "Bearer $token")
            .build()
        return chain.proceed(request)
    }
}

Δεξαμενή συνδέσεων και προσωρινή αποθήκευση OkHttp

Η δεξαμενή συνδέσεων (ConnectionPool) — η βασική βελτιστοποίηση του OkHttp, που επιτρέπει την επαναχρησιμοποίηση TCP συνδέσεων για πολλαπλά αιτήματα. Αντί να δημιουργεί μια νέα υποδοχή για κάθε αίτημα, το OkHttp αποθηκεύει έως και 5 ανενεργές συνδέσεις (από προεπιλογή) για 5 λεπτά, μειώνοντας την καθυστέρηση κατά 30–70% για επαναλαμβανόμενα αιτήματα στον ίδιο κεντρικό υπολογιστή.

Η προσωρινή αποθήκευση αποκρίσεων υλοποιείται μέσω της κλάσης Cache. Για ενεργοποίηση της προσωρινής αποθήκευσης, αρκεί να καθορίσετε τον κατάλογο και το μέγιστο μέγεθος στο OkHttpClient.Builder. Το OkHttp αποθηκεύει αυτόματα προσωρινά τις GET αποκρίσεις σύμφωνα με τις κεφαλίδες Cache-Control, Expires και ETag, επιστρέφοντας προσωρινά αποθηκευμένα δεδομένα χωρίς αίτημα δικτύου εάν δεν έχουν λήξει.

kotlin
val cacheDir = File(context.cacheDir, "http-cache")
val cache = Cache(cacheDir, 10L * 1024 * 1024)

val client = OkHttpClient.Builder()
    .cache(cache)
    .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))
    .build()

Η σωστή ρύθμιση της δεξαμενής και της προσωρινής αποθήκευσης είναι ιδιαίτερα σημαντική για εφαρμογές με συχνά αιτήματα — ροές ειδήσεων, συνομιλίες, ενημερώσεις δεδομένων. Χωρίς δεξαμενή, κάθε TCP σύνδεση απαιτεί τριπλή χειραψία (SYN, SYN-ACK, ACK) και πιθανή χειραψία TLS (2–3 round-trip), προσθέτοντας 100–500 ms σε κάθε αίτημα.

Το OkHttp υποστηρίζει επίσης WebSocket μέσω της κλάσης RealWebSocket. Η σύνδεση WebSocket δημιουργείται μέσω χειραψίας HTTP (101 Switching Protocols) και στη συνέχεια μεταβαίνει σε ένα αμφίδρομο πρωτόκολλο. Το OkHttp στέλνει αυτόματα πλαίσια ping για να διατηρεί τη σύνδεση ζωντανή και επανασυνδέεται σε περίπτωση αποκοπής. Το WebSocket από το OkHttp είναι συμβατό με τυπικά τελικά σημεία όπως το wss://echo.websocket.org.

Συνηθισμένα λάθη κατά την εργασία με OkHttp

Δημιουργία OkHttpClient για κάθε αίτημα — το πιο συνηθισμένο λάθος. Το OkHttpClient περιέχει τη δεξαμενή συνδέσεων, την προσωρινή αποθήκευση και τη δεξαμενή νημάτων. Η δημιουργία νέου στιγμιότυπου για κάθε αίτημα όχι μόνο σπαταλά μνήμη, αλλά στερεί και το πλεονέκτημα επαναχρησιμοποίησης συνδέσεων. Το OkHttpClient πρέπει να είναι singleton μέσω ενός DI κοντέινερ.

Η παράβλεψη κλεισίματος του Response.body() οδηγεί σε διαρροή πόρων. Το ResponseBody περιέχει ένα InputStream που πρέπει να κλείσει μετά την ανάγνωση. Εάν χρησιμοποιείται body().string() ή body().bytes(), το OkHttp κλείνει αυτόματα τη ροή, αλλά κατά την ανάγνωση body().byteStream() ή body().charStream() απαιτείται ρητή κλήση close() στο μπλοκ finally.

Έλλειψη χειρισμού χρονικής λήξης — ένα άλλο πρόβλημα. Από προεπιλογή, το OkHttp δεν έχει χρονικές λήξεις (connectTimeout = 10 δευτερόλεπτα, readTimeout = 10 δευτερόλεπτα, writeTimeout = 10 δευτερόλεπτα). Για εφαρμογές κινητών με ασταθή σύνδεση, συνιστάται η ρύθμιση connectTimeout 15–30 δευτερόλεπτα και readTimeout 15–30 δευτερόλεπτα, διαφορετικά ο χρήστης θα περιμένει πολύ σε ασθενές σήμα.

Συχνές ερωτήσεις

Σε τι διαφέρει το OkHttp από το Retrofit;

OkHttp είναι ένας χαμηλού επιπέδου HTTP-πελάτης με χειροκίνητη διαχείριση Request και Response. Το Retrofit είναι ένα υψηλού επιπέδου περιτύλιγμα με σχολιασμούς. Το OkHttp χρησιμοποιείται ως μεταφορέας για το Retrofit, αλλά μπορεί να λειτουργήσει και ανεξάρτητα χωρίς πρόσθετες βιβλιοθήκες.

Πώς χειρίζεται το OkHttp το HTTPS;

Το OkHttp χρησιμοποιεί SSLSocketFactory για τη χειραψία TLS. Η βιβλιοθήκη υποστηρίζει CertificatePinner για καρφίτσωμα πιστοποιητικών (Certificate Pinning), TrustManager για προσαρμοσμένη επικύρωση και HostnameVerifier για έλεγχο του ονόματος κεντρικού υπολογιστή έναντι του πιστοποιητικού.

Πώς να εντοπίσουμε σφάλματα δικτύου στο OkHttp;

Τα σύγχρονα αιτήματα ρίχνουν IOException σε προβλήματα δικτύου. Τα ασύγχρονα αιτήματα λαμβάνουν κλήση onFailure με IOException. Για σφάλματα HTTP (4xx, 5xx), η απόκριση θεωρείται επιτυχής — ο κωδικός σφάλματος ελέγχεται μέσω response.isSuccessful().

Υποστηρίζει το OkHttp WebSocket;

Ναι, το OkHttp έχει ενσωματωμένη υποστήριξη για WebSocket μέσω της κλάσης WebSocket και WebSocketListener. Μετά τη δημιουργία σύνδεσης, το WebSocket επιτρέπει την αποστολή και λήψη μηνυμάτων σε πραγματικό χρόνο χωρίς επαναλαμβανόμενα HTTP αιτήματα.

Πώς να απενεργοποιήσουμε τις ανακατευθύνσεις στο OkHttp;

Απενεργοποιήστε τις αυτόματες ανακατευθύνσεις μέσω followRedirects(false) και followSslRedirects(false) στο OkHttpClient.Builder. Αυτό είναι χρήσιμο όταν πρέπει να χειριστείτε χειροκίνητα την ανακατεύθυνση, για παράδειγμα, για εξαγωγή ενός διακριτικού από το URL ανακατεύθυνσης.

Σύνοψη

  • OkHttp — HTTP-πελάτης υψηλής απόδοσης από την Square με υποστήριξη HTTP/2 και SPDY
  • Αρχιτεκτονική παρεμβολέων υλοποιεί το Chain of Responsibility για τροποποίηση αιτημάτων
  • Δεξαμενή συνδέσεων επαναχρησιμοποιεί TCP συνδέσεις, μειώνοντας την καθυστέρηση κατά 30–70%
  • Προσωρινή αποθήκευση Cache-Control και ETag μειώνουν την κίνηση σε επαναλαμβανόμενα αιτήματα
  • WebSocket παρέχει αμφίδρομη επικοινωνία σε πραγματικό χρόνο
  • OkHttpClient πρέπει να είναι singleton — η δημιουργία για κάθε αίτημα οδηγεί σε διαρροές
  • ResponseBody απαιτεί ρητό κλείσιμο κατά την ανάγνωση ροής byteStream

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης