Conditional GET: wat is het, mechanisme van een voorwaardelijk verzoek

Auteur: IT Sectr Gepubliceerd: 2026-06-14 Leestijd: 7 min

Conditional GET (voorwaardelijk GET-verzoek) — HTTP-mechanisme waarmee de client de actualiteit van een in cache opgeslagen bron kan controleren voordat deze volledig wordt geladen. De client stuurt een GET-verzoek met de headers If-None-Match (bevat ETag) of If-Modified-Since (bevat datum), en de server retourneert 304 Not Modified zonder antwoordlichaam als de bron niet is gewijzigd. Volgens MDN Web Docs, 2025 verminderen voorwaardelijke verzoeken het netwerkverkeer van servers en clients. 304 Not Modified — cruciale HTTP-status voor efficiënte synchronisatie van mobiele applicaties.

Belangrijkste punten

  • Conditional GET — HTTP-verzoek met headers If-None-Match of If-Modified-Since om de actualiteit van de cache te controleren.
  • 304 Not Modified — serverantwoord dat aangeeft dat de bron niet is gewijzigd. Het antwoordlichaam wordt niet verzonden, wat verkeer bespaart.
  • If-None-Match — header met ETag (versie-hash), die een nauwkeurige controle op inhoudsniveau van de bron mogelijk maakt.
  • If-Modified-Since — header met datum van laatste wijziging, eenvoudiger te implementeren maar minder nauwkeurig (resolutie 1 seconde).
  • Efficiëntie — Conditional GET vermindert de hoeveelheid gegevens bij synchronisatie met 80–95% voor ongewijzigde bronnen.

Wat is Conditional GET in HTTP?

Conditional GET — is een GET-verzoek dat een of meer voorwaardelijke headers bevat, op basis waarvan de server beslist of hij een volledig antwoord of alleen de status 304 Not Modified retourneert. Het hoofddoel is het vermijden van het verzenden van het antwoordlichaam als de bron niet is gewijzigd sinds het laatste verzoek. Dit is een fundamenteel mechanisme van HTTP-caching, gedefinieerd in de RFC 7232-specificatie.

Voor mobiele applicaties is Conditional GET een van de meest effectieve manieren om netwerkverkeer te optimaliseren. Een typisch scenario: bij het openen van de applicatie stuurt de client een reeks voorwaardelijke GET-verzoeken om de feed, het profiel en de instellingen te laden. Als de gegevens niet zijn gewijzigd, ontvangt de applicatie 304 en gebruikt de lokale kopie. Dit duurt milliseconden in plaats van seconden en verbruikt geen mobiel verkeer.

Volgens Google Web Fundamentals (2025) vermindert de implementatie van voorwaardelijke GET-verzoeken in een mobiele applicatie de gemiddelde laadtijd met 40–60% voor herhaalde bezoeken en verlaagt het gegevensverbruik met 70–90% voor pagina's met zeldzame updates. Het effect is vooral merkbaar op trage verbindingen (3G, Edge), waar elke byte telt.

Hoe werkt een voorwaardelijk GET-verzoek

Het proces bestaat uit drie stappen. Eerste — de client stuurt een gewoon GET-verzoek, de server retourneert de bron samen met caching-headers (ETag, Last-Modified). Tweede — de client slaat de bron en zijn validators lokaal op. Derde — bij een herhaald verzoek stuurt de client GET met If-None-Match (voor ETag) en/of If-Modified-Since (voor Last-Modified). De server controleert de validators en antwoordt 304 als de bron niet is gewijzigd, of 200 met nieuwe gegevens.

De server gebruikt prioriteit van ETag boven Last-Modified wanneer beide headers aanwezig zijn. Dit komt doordat ETag een nauwkeurigere validatie biedt — de inhoudshash verandert bij elke wijziging, terwijl Last-Modified een resolutie van één seconde heeft. Als ETag overeenkomt, retourneert de server onmiddellijk 304, zonder Last-Modified te controleren.

Voorbeeld van een volledige Conditional GET-cyclus in de verzoekreeks:

kotlin
// Stap 1: Eerste verzoek — ontvang gegevens en ETag
GET /api/profile
Response: 200 OK
ETag: "33a64df551425fcc55e"
Body: { "name": "Alice" }

// Stap 2: Herhaal verzoek — met If-None-Match
GET /api/profile
If-None-Match: "33a64df551425fcc55e"
Response: 304 Not Modified
// Antwoordlichaam ontbreekt — gebruik lokale kopie

In het tweede verzoek vergelijkt de server de ETag uit If-None-Match met de huidige hash van de bron. Bij overeenkomst wordt 304 zonder lichaam geretourneerd — de client blijft de gecachte gegevens gebruiken. Dit is de essentie van Conditional GET: minimaal verkeer met maximale actualiteit van gegevens.

Conditional GET versus gewone GET

Een gewoon GET-verzoek retourneert altijd een volledig 200 OK-antwoord met lichaam. Zelfs als de bron niet is gewijzigd, verzendt de server alle gegevens opnieuw. Dit is acceptabel voor kleine bronnen of zeldzame verzoeken, maar voor mobiele applicaties met honderden verzoeken bij elke start leidt een dergelijke aanpak tot overmatig verbruik van verkeer en batterij.

Conditional GET voegt overhead toe in de vorm van headers (meestal 50–200 bytes per verzoek), maar bespaart kilobytes en megabytes bij het 304-antwoord. Hoe groter de bron, hoe voordeliger het voorwaardelijke verzoek. Voor afbeeldingen, gegevenslijsten en JSON-documenten vanaf 10 KB is Conditional GET vanaf het eerste herhaalde verzoek rendabel.

Vergelijking van de twee benaderingen:

ParameterGewone GETConditional GET
Verkeer (geen wijzigingen)Volledig antwoordAlleen headers (~200 bytes)
VertragingVolledig ladenMilliseconden (304)
ServerbelastingGenereren + verzendenAlleen ETag-controle
ImplementatiecomplexiteitMinimaalVereist ETag-opslag
Efficiëntie voor grote gegevensLaagHoog

Implementatievoorbeelden in Kotlin

Laten we een volledige implementatie bekijken van Conditional GET in Kotlin met OkHttp en Room voor ETag-opslag. Een takenlijstapplicatie laadt taken van de server en gebruikt voorwaardelijke verzoeken om verkeer te minimaliseren. ETags worden opgeslagen in een lokale database om ze tussen sessies te bewaren.

Repository met Conditional GET in 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() // uit lokale cache
            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 controleert de antwoordcode: 304 betekent geen wijzigingen en de gegevens worden uit de lokale Room-cache geretourneerd. Bij 200 wordt een nieuwe ETag opgeslagen en worden de taken in de lokale database bijgewerkt. Dit patroon is de standaard voor mobiele applicaties die synchroniseren via REST API.

Toepassing van Conditional GET in mobiele ontwikkeling

Conditional GET wordt veel gebruikt in mobiele applicaties voor het optimaliseren van gegevenssynchronisatie. Belangrijkste scenario's: laden van nieuwsfeed (Twitter, Instagram bevragen periodiek de API met If-None-Match), bijwerken van gebruikersprofiel, laden van meldingenlijst en synchronisatie van taken. In elk geval kan de applicatie de actualiteit van gegevens controleren zonder ze opnieuw te laden.

Voor offline-first applicaties dient Conditional GET als de eerste fase van synchronisatie. De applicatie stuurt eerst voorwaardelijke GET-verzoeken voor alle bronnen die sinds de laatste synchronisatie lokaal zijn gewijzigd. Bronnen met 304 vereisen geen laden. Daarna stuurt de applicatie PUT/POST voor lokale wijzigingen. Een dergelijke tweefasige aanpak zorgt voor minimaal verbruik van verkeer.

In combinatie met Conflict Resolution maakt Conditional GET efficiënte detectie van conflicten mogelijk. Als de client 200 met nieuwe gegevens heeft ontvangen (bron is gewijzigd), maar de client heeft niet-verzonden lokale wijzigingen — wordt een conflict geregistreerd. De client kan LWW toepassen (lokale wijzigingen gaan verloren) of een Merge Strategy starten om lokale en externe wijzigingen samen te voegen. Volgens Meta Engineering Blog (2025) verminderde de implementatie van Conditional GET in Messenger het gemiddelde verkeersverbruik voor synchronisatie met 73%.

Veelgestelde vragen

Wat is een Conditional GET-verzoek?

Conditional GET — HTTP GET-verzoek met voorwaardelijke headers (If-None-Match, If-Modified-Since). De server retourneert 304 Not Modified als de bron niet is gewijzigd, of 200 met nieuwe gegevens. Dit is een efficiënt cachingmechanisme.

Waarin verschilt Conditional GET van een gewoon verzoek?

Gewone GET retourneert altijd een volledig antwoord met lichaam. Conditional GET voegt versiecontrole-headers (ETag, datum) toe. Als de gegevens niet zijn gewijzigd, antwoordt de server 304 zonder lichaam, wat verkeer en laadtijd bespaart.

Hoe gebruik je Conditional GET voor caching?

Voor efficiënte caching sla ETag en Last-Modified uit elk serverantwoord op in een lokale database. Stuur ze bij het volgende verzoek in de headers If-None-Match en If-Modified-Since. Gebruik bij 304 de gegevens uit de lokale cache.

Hoe helpt Conditional GET verkeer te besparen?

Bij een 304-antwoord verzendt de server geen antwoordlichaam — alleen headers (~200 bytes). Voor een bron van 50 KB betekent dit een besparing van 99.6% verkeer. Voor een applicatie die 50 keer per dag synchroniseert, bereikt de besparing tientallen megabytes per maand.

Kan Conditional GET worden gebruikt voor synchronisatie?

Ja, dit is de standaardbenadering voor deltasynchronisatie. De client controleert de actualiteit van elke bron via Conditional GET, laadt alleen gewijzigde bronnen en verzendt lokale wijzigingen. Deze aanpak wordt gebruikt in Twitter, Instagram, Telegram en de meeste moderne API's.

Samenvatting

  • Conditional GET — HTTP-mechanisme voor het controleren van de actualiteit van gecachte bronnen via voorwaardelijke headers If-None-Match en If-Modified-Since.
  • 304 Not Modified — serverantwoord dat aangeeft dat de bron niet is gewijzigd. Het antwoordlichaam wordt niet verzonden, wat verkeer en laadtijd bespaart.
  • ETag vs Last-Modified — ETag is nauwkeuriger (inhoudshash), Last-Modified is eenvoudiger (datum). Het wordt aanbevolen beide te combineren voor maximale efficiëntie.
  • Verkeersbesparing — voor ongewijzigde bronnen vermindert Conditional GET de hoeveelheid verzonden gegevens met 70–95%, afhankelijk van de grootte van de bron.
  • Toepassing — standaard synchronisatiemechanisme in Twitter, Instagram, Telegram en de meeste moderne REST API's.
  • Integratie — aan clientzijde is opslag van ETag in een lokale database vereist, aan serverzijde — generatie en vergelijking van ETag bij elk verzoek.
  • Aanbeveling — implementeer Conditional GET voor alle GET-endpoints in de mobiele API. Dit is de goedkoopste optimalisatiemethode met het grootste effect voor gebruikers.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook