Conditional GET: mi ez, a feltételes kérés mechanizmusa

Szerző: IT Sectr Megjelenés: 2026-06-14 Olvasási idő: 7 perc

Conditional GET (feltételes GET kérés) — HTTP mechanizmus, amely lehetővé teszi az ügyfél számára, hogy a gyorsítótárazott erőforrás frissességét ellenőrizze a teljes betöltés előtt. Az ügyfél GET kérést küld az If-None-Match (ETag-ot tartalmaz) vagy If-Modified-Since (dátumot tartalmaz) fejlécekkel, és a szerver 304 Not Modified választ ad választest nélkül, ha az erőforrás nem változott. A MDN Web Docs, 2025 szerint a feltételes kérések csökkentik a szerverek és ügyfelek hálózati forgalmát. 304 Not Modified — kulcsfontosságú HTTP státusz a mobil alkalmazások hatékony szinkronizálásához.

Főbb pontok

  • Conditional GET — HTTP kérés If-None-Match vagy If-Modified-Since fejlécekkel a gyorsítótár frissességének ellenőrzéséhez.
  • 304 Not Modified — szerver válasz, amely jelzi, hogy az erőforrás nem változott. A választest nem kerül elküldésre, így forgalmat takarít meg.
  • If-None-Match — fejléc ETag-gal (verzió hash), amely pontos ellenőrzést biztosít az erőforrás tartalmi szintjén.
  • If-Modified-Since — fejléc az utolsó módosítás dátumával, egyszerűbb implementálni, de kevésbé pontos (1 másodperces felbontás).
  • Hatékonyság — A Conditional GET az adatmennyiséget szinkronizáláskor 80–95%-kal csökkenti a változatlan erőforrások esetén.

Mi a Conditional GET a HTTP-ben?

Conditional GET — egy GET kérés, amely egy vagy több feltételes fejlécet tartalmaz, amelyek alapján a szerver eldönti, hogy teljes választ vagy csak 304 Not Modified státuszt küldjön vissza. A fő cél a választest elküldésének elkerülése, ha az erőforrás nem változott az utolsó kérés óta. Ez a HTTP-gyorsítótárazás alapvető mechanizmusa, amelyet az RFC 7232 specifikáció határoz meg.

Mobil alkalmazások számára a Conditional GET az egyik leghatékonyabb módja a hálózati forgalom optimalizálásának. Tipikus forgatókönyv: az alkalmazás megnyitásakor az ügyfél egy sor feltételes GET kérést küld a hírfolyam, profil és beállítások betöltéséhez. Ha az adatok nem változtak, az alkalmazás 304-et kap és a helyi másolatot használja. Ez másodpercek helyett ezredmásodpercekig tart, és nem fogyaszt mobil adatforgalmat.

A Google Web Fundamentals (2025) szerint a feltételes GET kérések bevezetése egy mobil alkalmazásban 40–60%-kal csökkenti az átlagos betöltési időt ismételt látogatások esetén, és 70–90%-kal mérsékli az adatforgalmat a ritkán frissülő oldalaknál. A hatás különösen lassú kapcsolatoknál (3G, Edge) észlelhető, ahol minden byte számít.

Hogyan működik a feltételes GET kérés

A folyamat három lépésből áll. Első — az ügyfél egy szokásos GET kérést küld, a szerver visszaadja az erőforrást a gyorsítótárazási fejlécekkel (ETag, Last-Modified) együtt. Második — az ügyfél helyileg elmenti az erőforrást és annak érvényesítőit. Harmadik — ismételt kéréskor az ügyfél GET-et küld If-None-Match (ETag-hoz) és/vagy If-Modified-Since (Last-Modified-hez) fejlécekkel. A szerver ellenőrzi az érvényesítőket, és 304-gyel válaszol, ha az erőforrás nem változott, vagy 200-zal új adatokkal.

A szerver az ETag elsőbbségét használja a Last-Modified-dal szemben, ha mindkét fejléc jelen van. Ez azért van, mert az ETag pontosabb érvényesítést biztosít — a tartalom hash-je minden változáskor módosul, míg a Last-Modified felbontása egy másodperc. Ha az ETag egyezik, a szerver azonnal 304-et küld vissza, anélkül hogy ellenőrizné a Last-Modified-t.

Példa a Conditional GET teljes ciklusára a kérések sorrendjében:

kotlin
// 1. lépés: Első kérés — adatok és ETag lekérése
GET /api/profile
Response: 200 OK
ETag: "33a64df551425fcc55e"
Body: { "name": "Alice" }

// 2. lépés: Kérés megismétlése — If-None-Match-al
GET /api/profile
If-None-Match: "33a64df551425fcc55e"
Response: 304 Not Modified
// A választest hiányzik — használja a helyi másolatot

A második kérésben a szerver összehasonlítja az If-None-Match-ból származó ETag-ot az erőforrás aktuális hash-jével. Egyezés esetén 304 kerül visszaküldésre test nélkül — az ügyfél folytatja a gyorsítótárazott adatok használatát. Ez a Conditional GET lényege: minimális forgalom maximális adatfrissesség mellett.

Conditional GET a szokásos GET-tel szemben

A szokásos GET kérés mindig teljes 200 OK választ ad vissza testtel. Még ha az erőforrás nem is változott, a szerver újra elküldi az összes adatot. Ez elfogadható kis erőforrások vagy ritka kérések esetén, de a mobil alkalmazásoknál, amelyek minden indításkor több száz kérést küldenek, ez a megközelítés túlzott adat- és akkumulátorfogyasztáshoz vezet.

Conditional GET többletterhelést ad a fejlécek formájában (általában 50–200 byte kérésenként), de kilobyte-okat és megabyte-okat takarít meg a 304-es válasznál. Minél nagyobb az erőforrás, annál előnyösebb a feltételes kérés. Képek, adatlisták és JSON dokumentumok esetén 10 KB-tól a Conditional GET az első ismételt kérésnél megtérül.

A két megközelítés összehasonlítása:

ParaméterSzokásos GETConditional GET
Forgalom (nincs változás)Teljes válaszCsak fejlécek (~200 byte)
KésleltetésTeljes betöltésEzredmásodpercek (304)
SzerverterhelésGenerálás + küldésCsak ETag ellenőrzés
Implementáció bonyolultságaMinimálisETag tárolást igényel
Hatékonyság nagy adatoknálAlacsonyMagas

Implementációs példák Kotlinban

Vizsgáljuk meg egy teljes implementációt a Conditional GET-ről Kotlinban OkHttp és Room használatával az ETag tárolására. Egy feladatlista alkalmazás betölti a feladatokat a szerverről, és feltételes kéréseket használ a forgalom minimalizálására. Az ETag-ok helyi adatbázisban tárolódnak a munkamenetek közötti megőrzés érdekében.

Repository Conditional GET-tel Kotlinban:

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() // a helyi gyorsítótárból
            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 ellenőrzi a válaszkódot: a 304 változás hiányát jelenti, és az adatok a Room helyi gyorsítótárából kerülnek visszaadásra. 200 esetén az új ETag elmentésre kerül, és a feladatok frissülnek a helyi adatbázisban. Ez a minta a REST API-n keresztül szinkronizáló mobil alkalmazások szabványa.

A Conditional GET alkalmazása a mobilfejlesztésben

A Conditional GET széles körben használatos mobil alkalmazásokban az adatszinkronizálás optimalizálására. Fő forgatókönyvek: hírfolyam betöltése (Twitter, Instagram periodikusan lekérdezi az API-t If-None-Match-al), felhasználói profil frissítése, értesítési lista betöltése és feladatok szinkronizálása. Minden esetben az alkalmazás ellenőrizheti az adatok frissességét anélkül, hogy újratöltené azokat.

Offline-first alkalmazások számára a Conditional GET a szinkronizálás első fázisaként szolgál. Az alkalmazás először feltételes GET kéréseket küld minden olyan erőforrásra, amely az utolsó szinkronizálás óta helyileg módosult. A 304-es erőforrások nem igényelnek betöltést. Ezt követően az alkalmazás PUT/POST kéréseket küld a helyi változtatásokhoz. Ez a kétfázisú megközelítés minimális adatforgalmat biztosít.

A Conflict Resolution kombinációjával a Conditional GET lehetővé teszi az ütközések hatékony észlelését. Ha az ügyfél 200-at kapott új adatokkal (az erőforrás megváltozott), de az ügyfélnek elküldetlen helyi változtatásai vannak — ütközés kerül rögzítésre. Az ügyfél alkalmazhat LWW-t (a helyi változtatások elvesznek) vagy elindíthat egy Merge Strategy-t a helyi és távoli változtatások egyesítésére. A Meta Engineering Blog (2025) szerint a Conditional GET bevezetése a Messengerben 73%-kal csökkentette az átlagos adatforgalmat a szinkronizálás során.

Gyakran Ismételt Kérdések

Mi az a Conditional GET kérés?

Conditional GET — HTTP GET kérés feltételes fejlécekkel (If-None-Match, If-Modified-Since). A szerver 304 Not Modified választ ad, ha az erőforrás nem változott, vagy 200-at új adatokkal. Ez egy hatékony gyorsítótárazási mechanizmus.

Miben különbözik a Conditional GET a szokásos kéréstől?

Szokásos GET mindig teljes választ ad vissza testtel. Conditional GET verzióellenőrző fejléceket (ETag, dátum) ad hozzá. Ha az adatok nem változtak, a szerver 304-gyel válaszol test nélkül, forgalmat és betöltési időt takarítva meg.

Hogyan használjam a Conditional GET-et gyorsítótárazáshoz?

Hatékony gyorsítótárazáshoz mentse el az ETag-ot és a Last-Modified-t minden szerver válaszból egy helyi adatbázisba. A következő kérésnél küldje el őket az If-None-Match és If-Modified-Since fejlécekben. 304 esetén használja a helyi gyorsítótár adatait.

Hogyan segít a Conditional GET adatforgalmat megtakarítani?

304-es válasznál a szerver nem küld választestet — csak fejléceket (~200 byte). Egy 50 KB méretű erőforrás esetén ez 99,6% adatforgalom megtakarítást jelent. Egy napi 50-szer szinkronizáló alkalmazásnál a megtakarítás eléri a több tíz megabyte-ot havonta.

Használható a Conditional GET szinkronizáláshoz?

Igen, ez a szabványos megközelítés a delta szinkronizáláshoz. Az ügyfél ellenőrzi minden erőforrás frissességét Conditional GET segítségével, csak a megváltozottakat tölti le és elküldi a helyi változtatásokat. Ezt a megközelítést használja a Twitter, Instagram, Telegram és a legtöbb modern API.

Összefoglalás

  • Conditional GET — HTTP mechanizmus a gyorsítótárazott erőforrások frissességének ellenőrzésére feltételes If-None-Match és If-Modified-Since fejléceken keresztül.
  • 304 Not Modified — szerver válasz, amely jelzi, hogy az erőforrás nem változott. A választest nem kerül elküldésre, forgalmat és betöltési időt takarítva meg.
  • ETag vs Last-Modified — az ETag pontosabb (tartalom hash), a Last-Modified egyszerűbb (dátum). Javasolt mindkettőt kombinálni a maximális hatékonyság érdekében.
  • Adatforgalom megtakarítás — változatlan erőforrások esetén a Conditional GET 70–95%-kal csökkenti az elküldött adatok mennyiségét az erőforrás méretétől függően.
  • Alkalmazás — szabványos szinkronizálási mechanizmus a Twitter, Instagram, Telegram és a legtöbb modern REST API esetében.
  • Integráció — az ügyfél oldalon ETag tárolása szükséges helyi adatbázisban, a szerver oldalon — ETag generálása és összehasonlítása minden kérésnél.
  • Javaslat — implementálja a Conditional GET-et az összes GET végponthoz a mobil API-ban. Ez a legolcsóbb optimalizálási módszer a legnagyobb felhasználói hatással.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is