Conditional GET: τι είναι, μηχανισμός υπό όρους αιτήματος

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

Conditional GET (αίτημα GET υπό όρους) — μηχανισμός HTTP που επιτρέπει στον πελάτη να ελέγξει την επικαιρότητα ενός πόρου που βρίσκεται στην προσωρινή μνήμη πριν από την πλήρη φόρτωση. Ο πελάτης στέλνει ένα αίτημα GET με τις κεφαλίδες If-None-Match (περιέχει ETag) ή If-Modified-Since (περιέχει ημερομηνία) και ο διακομιστής επιστρέφει 304 Not Modified χωρίς σώμα απόκρισης, εάν ο πόρος δεν έχει αλλάξει. Σύμφωνα με το MDN Web Docs, 2025, τα αιτήματα υπό όρους μειώνουν την κυκλοφορία δικτύου διακομιστών και πελατών. 304 Not Modified — βασική κατάσταση HTTP για αποτελεσματικό συγχρονισμό εφαρμογών για κινητά.

Κύρια σημεία

  • Conditional GET — αίτημα HTTP με κεφαλίδες If-None-Match ή If-Modified-Since για έλεγχο επικαιρότητας της προσωρινής μνήμης.
  • 304 Not Modified — απόκριση διακομιστή που υποδεικνύει ότι ο πόρος δεν έχει αλλάξει. Το σώμα απόκρισης δεν μεταδίδεται, εξοικονομώντας κίνηση.
  • If-None-Match — κεφαλίδα με ETag (hash έκδοσης), που παρέχει ακριβή έλεγχο σε επίπεδο περιεχομένου του πόρου.
  • If-Modified-Since — κεφαλίδα με ημερομηνία τελευταίας τροποποίησης, απλούστερη στην υλοποίηση αλλά λιγότερο ακριβής (ανάλυση 1 δευτερολέπτου).
  • Αποδοτικότητα — Το Conditional GET μειώνει τον όγκο δεδομένων κατά τον συγχρονισμό κατά 80–95% για αμετάβλητους πόρους.

Τι είναι το Conditional GET στο HTTP;

Conditional GET — είναι ένα αίτημα GET που περιέχει μία ή περισσότερες κεφαλίδες υπό όρους, βάσει των οποίων ο διακομιστής αποφασίζει εάν θα επιστρέψει πλήρη απόκριση ή μόνο την κατάσταση 304 Not Modified. Ο κύριος στόχος είναι η αποφυγή μετάδοσης του σώματος απόκρισης, εάν ο πόρος δεν έχει αλλάξει από το τελευταίο αίτημα. Αυτός είναι ένας θεμελιώδης μηχανισμός προσωρινής αποθήκευσης HTTP, που ορίζεται στην προδιαγραφή RFC 7232.

Για εφαρμογές για κινητά, το Conditional GET είναι ένας από τους πιο αποτελεσματικούς τρόπους βελτιστοποίησης της κυκλοφορίας δικτύου. Τυπικό σενάριο: κατά το άνοιγμα της εφαρμογής, ο πελάτης στέλνει μια σειρά αιτημάτων GET υπό όρους για φόρτωση της ροής, του προφίλ και των ρυθμίσεων. Εάν τα δεδομένα δεν έχουν αλλάξει, η εφαρμογή λαμβάνει 304 και χρησιμοποιεί το τοπικό αντίγραφο. Αυτό διαρκεί χιλιοστά του δευτερολέπτου αντί για δευτερόλεπτα και δεν καταναλώνει κινητή κίνηση.

Σύμφωνα με το Google Web Fundamentals (2025), η εφαρμογή αιτημάτων GET υπό όρους σε μια εφαρμογή για κινητά μειώνει τον μέσο χρόνο φόρτωσης κατά 40–60% για επαναλαμβανόμενες επισκέψεις και μειώνει την κατανάλωση κίνησης κατά 70–90% για σελίδες με σπάνιες ενημερώσεις. Το αποτέλεσμα είναι ιδιαίτερα αισθητό σε αργές συνδέσεις (3G, Edge), όπου κάθε byte μετράει.

Πώς λειτουργεί το αίτημα GET υπό όρους

Η διαδικασία αποτελείται από τρία βήματα. Πρώτο — ο πελάτης στέλνει ένα κανονικό αίτημα GET, ο διακομιστής επιστρέφει τον πόρο μαζί με τις κεφαλίδες προσωρινής αποθήκευσης (ETag, Last-Modified). Δεύτερο — ο πελάτης αποθηκεύει τον πόρο και τους επικυρωτές του τοπικά. Τρίτο — σε επαναλαμβανόμενο αίτημα, ο πελάτης στέλνει GET με If-None-Match (για ETag) ή/και If-Modified-Since (για Last-Modified). Ο διακομιστής ελέγχει τους επικυρωτές και απαντά 304 εάν ο πόρος δεν έχει αλλάξει, ή 200 με νέα δεδομένα.

Ο διακομιστής χρησιμοποιεί προτεραιότητα του ETag έναντι του Last-Modified όταν υπάρχουν και οι δύο κεφαλίδες. Αυτό συμβαίνει επειδή το ETag παρέχει ακριβέστερη επικύρωση — το hash περιεχομένου αλλάζει με οποιαδήποτε αλλαγή, ενώ το Last-Modified έχει ανάλυση ενός δευτερολέπτου. Εάν το ETag ταιριάζει, ο διακομιστής επιστρέφει αμέσως 304, χωρίς να ελέγξει το Last-Modified.

Παράδειγμα πλήρους κύκλου Conditional GET στην ακολουθία αιτημάτων:

kotlin
// Βήμα 1: Πρώτο αίτημα — λήψη δεδομένων και ETag
GET /api/profile
Response: 200 OK
ETag: "33a64df551425fcc55e"
Body: { "name": "Alice" }

// Βήμα 2: Επανάληψη αιτήματος — με If-None-Match
GET /api/profile
If-None-Match: "33a64df551425fcc55e"
Response: 304 Not Modified
// Το σώμα απόκρισης απουσιάζει — χρησιμοποιήστε το τοπικό αντίγραφο

Στο δεύτερο αίτημα, ο διακομιστής συγκρίνει το ETag από το If-None-Match με το τρέχον hash του πόρου. Σε περίπτωση αντιστοιχίας, επιστρέφεται 304 χωρίς σώμα — ο πελάτης συνεχίζει να χρησιμοποιεί τα δεδομένα από την προσωρινή μνήμη. Αυτή είναι η ουσία του Conditional GET: ελάχιστη κίνηση με μέγιστη επικαιρότητα δεδομένων.

Conditional GET εναντίον κανονικού GET

Το κανονικό αίτημα GET επιστρέφει πάντα πλήρη απόκριση 200 OK με σώμα. Ακόμα κι αν ο πόρος δεν έχει αλλάξει, ο διακομιστής μεταδίδει ξανά όλα τα δεδομένα. Αυτό είναι αποδεκτό για μικρούς πόρους ή σπάνια αιτήματα, αλλά για εφαρμογές για κινητά με εκατοντάδες αιτήματα σε κάθε εκκίνηση, μια τέτοια προσέγγιση οδηγεί σε υπερβολική κατανάλωση κίνησης και μπαταρίας.

Conditional GET προσθέτει επιβάρυνση με τη μορφή κεφαλίδων (συνήθως 50–200 byte ανά αίτημα), αλλά εξοικονομεί kilobyte και megabyte στην απόκριση 304. Όσο μεγαλύτερος είναι ο πόρος, τόσο πιο συμφέρουσα είναι η αίτηση υπό όρους. Για εικόνες, λίστες δεδομένων και έγγραφα JSON από 10 KB και άνω, το Conditional GET αποδίδει από το πρώτο επαναλαμβανόμενο αίτημα.

Σύγκριση των δύο προσεγγίσεων:

ΠαράμετροςΚανονικό GETConditional GET
Κίνηση (χωρίς αλλαγές)Πλήρης απόκρισηΜόνο κεφαλίδες (~200 byte)
ΚαθυστέρησηΠλήρης φόρτωσηΧιλιοστά δευτερολέπτου (304)
Φόρτος διακομιστήΔημιουργία + μετάδοσηΜόνο έλεγχος ETag
Πολυπλοκότητα υλοποίησηςΕλάχιστηΑπαιτεί αποθήκευση ETag
Αποδοτικότητα για μεγάλα δεδομέναΧαμηλήΥψηλή

Παραδείγματα υλοποίησης σε Kotlin

Ας εξετάσουμε μια πλήρη υλοποίηση του Conditional GET σε Kotlin χρησιμοποιώντας OkHttp και Room για αποθήκευση ETag. Μια εφαρμογή λίστας εργασιών φορτώνει εργασίες από τον διακομιστή και χρησιμοποιεί αιτήματα υπό όρους για ελαχιστοποίηση της κίνησης. Τα ETag αποθηκεύονται στην τοπική βάση δεδομένων για διατήρηση μεταξύ των συνεδριών.

Αποθετήριο με Conditional GET σε Kotlin:

kotlin
class TaskRepository(
    private val api: TaskApi,
    private val etagDao: EtagDao
) {
    suspend fun getTasks(): List<Task> {
        val savedEtag = etagDao.getEtag("tasks")

        val response = api.fetchTasks(
            ifNoneMatch = savedEtag
        )

        return when (response.code()) {
            304 -> taskDao.getAll() // από την τοπική προσωρινή μνήμη
            200 -> {
                response.header("ETag")?.let {
                    etagDao.saveEtag("tasks", it)
                }
                val tasks = response.body() ?: emptyList()
                taskDao.replaceAll(tasks)
                tasks
            }
            else -> throw Exception(
                "Sync failed: ${response.code()}")
        }
    }
}

TaskRepository ελέγχει τον κωδικό απόκρισης: το 304 σημαίνει καμία αλλαγή και τα δεδομένα επιστρέφονται από την τοπική προσωρινή μνήμη Room. Στο 200, το νέο ETag αποθηκεύεται και οι εργασίες ενημερώνονται στην τοπική βάση δεδομένων. Αυτό το μοτίβο είναι το πρότυπο για εφαρμογές για κινητά που συγχρονίζονται μέσω REST API.

Εφαρμογή του Conditional GET στην ανάπτυξη εφαρμογών για κινητά

Το Conditional GET χρησιμοποιείται ευρέως σε εφαρμογές για κινητά για βελτιστοποίηση του συγχρονισμού δεδομένων. Βασικά σενάρια: φόρτωση ροής ειδήσεων (Twitter, Instagram περιοδικά ρωτούν το API με If-None-Match), ενημέρωση προφίλ χρήστη, φόρτωση λίστας ειδοποιήσεων και συγχρονισμός εργασιών. Σε κάθε περίπτωση, η εφαρμογή μπορεί να ελέγξει την επικαιρότητα των δεδομένων χωρίς να τα φορτώσει ξανά.

Για εφαρμογές offline-first, το Conditional GET χρησιμεύει ως το πρώτο στάδιο συγχρονισμού. Η εφαρμογή στέλνει πρώτα αιτήματα GET υπό όρους για όλους τους πόρους που έχουν τροποποιηθεί τοπικά από τον τελευταίο συγχρονισμό. Οι πόροι με 304 δεν απαιτούν φόρτωση. Στη συνέχεια, η εφαρμογή στέλνει PUT/POST για τοπικές αλλαγές. Μια τέτοια προσέγγιση δύο φάσεων εξασφαλίζει ελάχιστη κατανάλωση κίνησης.

Σε συνδυασμό με το Conflict Resolution, το Conditional GET επιτρέπει τον αποτελεσματικό εντοπισμό διενέξεων. Εάν ο πελάτης έλαβε 200 με νέα δεδομένα (ο πόρος άλλαξε), αλλά ο πελάτης έχει μη σταλείσες τοπικές αλλαγές — καταγράφεται διένεξη. Ο πελάτης μπορεί να εφαρμόσει LWW (οι τοπικές αλλαγές χάνονται) ή να εκκινήσει μια Στρατηγική Συγχώνευσης για συνδυασμό τοπικών και απομακρυσμένων αλλαγών. Σύμφωνα με το Meta Engineering Blog (2025), η εφαρμογή του Conditional GET στο Messenger μείωσε τη μέση κατανάλωση κίνησης συγχρονισμού κατά 73%.

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

Τι είναι ένα αίτημα Conditional GET;

Conditional GET — αίτημα HTTP GET με κεφαλίδες υπό όρους (If-None-Match, If-Modified-Since). Ο διακομιστής επιστρέφει 304 Not Modified εάν ο πόρος δεν έχει αλλάξει ή 200 με νέα δεδομένα. Αυτός είναι ένας αποτελεσματικός μηχανισμός προσωρινής αποθήκευσης.

Πώς διαφέρει το Conditional GET από ένα κανονικό αίτημα;

Κανονικό GET επιστρέφει πάντα πλήρη απόκριση με σώμα. Conditional GET προσθέτει κεφαλίδες ελέγχου έκδοσης (ETag, ημερομηνία). Εάν τα δεδομένα δεν έχουν αλλάξει, ο διακομιστής απαντά 304 χωρίς σώμα, εξοικονομώντας κίνηση και χρόνο φόρτωσης.

Πώς να χρησιμοποιήσετε το Conditional GET για προσωρινή αποθήκευση;

Για αποτελεσματική προσωρινή αποθήκευση αποθηκεύστε το ETag και το Last-Modified από κάθε απόκριση διακομιστή σε μια τοπική βάση δεδομένων. Στο επόμενο αίτημα, στείλτε τα στις κεφαλίδες If-None-Match και If-Modified-Since. Στο 304, χρησιμοποιήστε δεδομένα από την τοπική προσωρινή μνήμη.

Πώς βοηθά το Conditional GET στην εξοικονόμηση κίνησης;

Στην απόκριση 304 ο διακομιστής δεν μεταδίδει σώμα απόκρισης — μόνο κεφαλίδες (~200 byte). Για έναν πόρο μεγέθους 50 KB, αυτό σημαίνει εξοικονόμηση 99,6% κίνησης. Για μια εφαρμογή που συγχρονίζεται 50 φορές την ημέρα, η εξοικονόμηση φτάνει τις δεκάδες megabyte το μήνα.

Μπορεί το Conditional GET να χρησιμοποιηθεί για συγχρονισμό;

Ναι, αυτή είναι η τυπική προσέγγιση για συγχρονισμό δέλτα. Ο πελάτης ελέγχει την επικαιρότητα κάθε πόρου μέσω Conditional GET, φορτώνει μόνο τους αλλαγμένους και στέλνει τοπικές αλλαγές. Αυτή η προσέγγιση χρησιμοποιείται στο Twitter, Instagram, Telegram και στα περισσότερα σύγχρονα API.

Σύνοψη

  • Conditional GET — μηχανισμός HTTP για έλεγχο επικαιρότητας πόρων στην προσωρινή μνήμη μέσω κεφαλίδων υπό όρους If-None-Match και If-Modified-Since.
  • 304 Not Modified — απόκριση διακομιστή που υποδεικνύει ότι ο πόρος δεν έχει αλλάξει. Το σώμα απόκρισης δεν μεταδίδεται, εξοικονομώντας κίνηση και χρόνο φόρτωσης.
  • ETag εναντίον Last-Modified — το ETag είναι ακριβέστερο (hash περιεχομένου), το Last-Modified είναι απλούστερο (ημερομηνία). Συνιστάται ο συνδυασμός και των δύο για μέγιστη αποδοτικότητα.
  • Εξοικονόμηση κίνησης — για αμετάβλητους πόρους, το Conditional GET μειώνει τον όγκο των μεταδιδόμενων δεδομένων κατά 70–95% ανάλογα με το μέγεθος του πόρου.
  • Εφαρμογή — τυπικός μηχανισμός συγχρονισμού στο Twitter, Instagram, Telegram και στα περισσότερα σύγχρονα REST API.
  • Ενσωμάτωση — στην πλευρά του πελάτη απαιτείται αποθήκευση ETag σε τοπική βάση δεδομένων, στην πλευρά του διακομιστή — δημιουργία και σύγκριση ETag σε κάθε αίτημα.
  • Σύσταση — εφαρμόστε το Conditional GET για όλα τα τελικά σημεία GET στο κινητό API. Είναι η φθηνότερη μέθοδος βελτιστοποίησης με το μεγαλύτερο αποτέλεσμα για τους χρήστες.

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

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

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

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