Conditional GET : ce que c’est, le mécanisme de requête conditionnelle

Auteur : IT Sectr Publié le : 2026-06-14 Temps de lecture : 7 min

Conditional GET — un mécanisme HTTP qui permet à un client de vérifier la pertinence d’une resource en cache avant un téléchargement complet. Le client envoie une requête GET avec les en-têtes If-None-Match (contenant ETag) ou If-Modified-Since (contenant une date), et le serveur retourne 304 Not Modified sans corps de réponse si la ressource n’a pas changé. Selon MDN Web Docs, 2025, les requêtes conditionnelles réduisent le trafic réseau des serveurs et des clients. 304 Not Modified est un statut HTTP clé pour la synchronisation efficace des applications mobiles.

Points essentiels

  • Conditional GET — une requête HTTP avec des en-têtes If-None-Match ou If-Modified-Since pour vérifier la pertinence du cache.
  • 304 Not Modified — une réponse du serveur indiquant que la ressource n’a pas changé. Aucun corps de réponse n’est envoyé, économisant du trafic.
  • If-None-Match — un en-tête avec un ETag (hash de version), fournissant une validation précise au niveau du contenu de la ressource.
  • If-Modified-Since — un en-tête avec la date de dernière modification, plus simple à implémenter mais moins précis (résolution d’une seconde).
  • Efficacité — Conditional GET réduit le volume de données lors de la synchronisation de 80–95% pour les ressources inchangées.

Qu’est-ce que Conditional GET en HTTP ?

Conditional GET est une requête GET qui inclut un ou plusieurs en-têtes conditionnels, sur la base desquels le serveur décide s’il doit retourner une réponse complète ou seulement le statut 304 Not Modified. L’objectif principal est d’éviter la transmission du corps de la réponse si la ressource n’a pas changé depuis la dernière requête. Il s’agit d’un mécanisme fondamental de mise en cache HTTP défini dans la RFC 7232.

Pour les applications mobiles, Conditional GET est l’un des moyens les plus efficaces d’optimiser le trafic réseau. Un scénario typique : à l’ouverture de l’application, le client envoie une série de requêtes GET conditionnelles pour charger le fil d’actualité, le profil et les paramètres. Si les données n’ont pas changé, l’application reçoit 304 et utilise la copie locale. Cela prend des millisecondes au lieu de secondes et ne consomme pas de données mobiles.

Selon Google Web Fundamentals (2025), l’implémentation de requêtes GET conditionnelles dans une application mobile réduit le temps de chargement moyen de 40–60% pour les visites répétées et diminue l’utilisation du trafic de 70–90% pour les pages à mises à jour peu fréquentes. L’effet est particulièrement notable sur les connexions lentes (3G, Edge), où chaque octet compte.

Comment fonctionne une requête GET conditionnelle

Le processus comprend trois étapes. Première — le client envoie une requête GET normale, le serveur retourne la ressource avec les en-têtes de cache (ETag, Last-Modified). Deuxième — le client sauvegarde la ressource et ses validateurs localement. Troisième — lors d’une requête répétée, le client envoie un GET avec If-None-Match (pour ETag) et/ou If-Modified-Since (pour Last-Modified). Le serveur vérifie les validateurs et répond 304 si la ressource n’a pas changé, ou 200 avec de nouvelles données.

Le serveur utilise la priorité d’ETag sur Last-Modified lorsque les deux en-têtes sont présents. Cela est dû au fait qu’ETag fournit une validation plus précise — le hash du contenu change avec toute modification, tandis que Last-Modified a une résolution d’une seconde. Si l’ETag correspond, le serveur retourne immédiatement 304 sans vérifier Last-Modified.

Exemple d’un cycle complet de Conditional GET dans une séquence de requêtes :

kotlin
// Étape 1 : Première requête — obtenir les données et ETag
GET /api/profile
Response: 200 OK
ETag: "33a64df551425fcc55e"
Body: { "name": "Alice" }

// Étape 2 : Répéter la requête — avec If-None-Match
GET /api/profile
If-None-Match: "33a64df551425fcc55e"
Response: 304 Not Modified
// Corps de réponse absent — utiliser la copie locale

Dans la deuxième requête, le serveur compare l’ETag de If-None-Match avec le hash actuel de la ressource. S’ils correspondent, il retourne 304 sans corps — le client continue d’utiliser les données en cache. C’est l’essence de Conditional GET : un trafic minimal avec une pertinence maximale des données.

Conditional GET vs GET normal

Une requête GET normale retourne toujours une réponse complète 200 OK avec un corps. Même si la ressource n’a pas changé, le serveur transmet toutes les données à nouveau. Cela est acceptable pour les petites ressources ou les requêtes peu fréquentes, mais pour les applications mobiles avec des centaines de requêtes à chaque lancement, cette approche entraîne une consommation excessive de trafic et de batterie.

Conditional GET ajoute une surcharge sous forme d’en-têtes (généralement 50–200 octets par requête) mais économise des kilo-octets et des méga-octets avec une réponse 304. Plus la ressource est grande, plus la requête conditionnelle est bénéfique. Pour les images, les listes de données et les documents JSON à partir de 10 Ko, Conditional GET est rentable dès la première requête répétée.

Caractéristiques comparatives des deux approches :

ParamètreGET normalConditional GET
Trafic (aucun changement)Réponse complèteEn-têtes uniquement (~200 octets)
LatenceTéléchargement completMillisecondes (304)
Charge serveurGénération + transfertVérification ETag uniquement
Complexité d’implémentationMinimaleNécessite stockage d’ETag
Efficacité pour les grandes donnéesFaibleÉlevée

Exemples d’implémentation en Kotlin

Voyons une implémentation complète de Conditional GET en Kotlin avec OkHttp et Room pour le stockage d’ETag. Une application de liste de tâches charge les tâches depuis le serveur et utilise des requêtes conditionnelles pour minimiser le trafic. Les ETags sont stockés dans une base de données locale pour persister entre les sessions.

Dépôt avec Conditional GET en 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() // du cache local
            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 vérifie le code de réponse : 304 signifie aucun changement, et les données sont retournées depuis le cache local de Room. En 200, un nouvel ETag est sauvegardé et les tâches sont mises à jour dans la base de données locale. Ce motif est un standard pour les applications mobiles avec synchronisation via API REST.

Utilisation de Conditional GET dans le développement mobile

Conditional GET est largement utilisé dans les applications mobiles pour l’optimisation de la synchronisation des données. Principaux scénarios : chargement des flux d’actualités (Twitter, Instagram interrogent périodiquement l’API avec If-None-Match), mise à jour des profils utilisateur, chargement des listes de notifications et synchronisation des tâches. Dans chaque cas, l’application peut vérifier la pertinence des données sans les télécharger à nouveau.

Pour les applications offline-first, Conditional GET sert de première étape de la synchronisation. L’application envoie d’abord des requêtes GET conditionnelles pour toutes les ressources qui ont été modifiées localement depuis la dernière synchronisation. Les ressources avec 304 ne nécessitent pas de téléchargement. Ensuite, l’application envoie PUT/POST pour les modifications locales. Cette approche en deux phases garantit une consommation minimale de trafic.

En combinaison avec la Résolution de Conflits, Conditional GET permet une détection efficace des conflits. Si le client reçoit 200 avec de nouvelles données (la ressource a changé) mais a des modifications locales non envoyées — un conflit est enregistré. Le client peut soit appliquer LWW (les modifications locales sont perdues), soit lancer une Stratégie de Fusion pour fusionner les modifications locales et distantes. Selon Meta Engineering Blog (2025), l’implémentation de Conditional GET dans Messenger a réduit le trafic de synchronisation moyen de 73%.

Foire aux questions

Qu’est-ce qu’une requête Conditional GET ?

Conditional GET — une requête HTTP GET avec des en-têtes conditionnels (If-None-Match, If-Modified-Since). Le serveur retourne 304 Not Modified si la ressource n’a pas changé, ou 200 avec de nouvelles données. C’est un mécanisme de cache efficace.

En quoi Conditional GET diffère-t-il d’une requête normale ?

Un GET normal retourne toujours une réponse complète avec corps. Conditional GET ajoute des en-têtes de vérification de version (ETag, date). Si les données n’ont pas changé, le serveur répond 304 sans corps, économisant trafic et temps de chargement.

Comment utiliser Conditional GET pour la mise en cache ?

Pour une mise en cache efficace, sauvegardez ETag et Last-Modified de chaque réponse serveur dans une base de données locale. Lors de la prochaine requête, envoyez-les dans les en-têtes If-None-Match et If-Modified-Since. En 304, utilisez les données du cache local.

Comment Conditional GET aide-t-il à économiser du trafic ?

Lors d’une réponse 304, le serveur ne transmet pas le corps de la réponse — seulement les en-têtes (~200 octets). Pour une ressource de 50 Ko, cela représente une économie de trafic de 99,6%. Pour une application qui se synchronise 50 fois par jour, les économies atteignent des dizaines de mégaoctets par mois.

Peut-on utiliser Conditional GET pour la synchronisation ?

Oui, c’est l’approche standard pour la synchronisation delta. Le client vérifie la pertinence de chaque ressource via Conditional GET, télécharge uniquement celles qui ont changé et envoie les modifications locales. Cette approche est utilisée dans Twitter, Instagram, Telegram et la plupart des API modernes.

Résumé

  • Conditional GET — un mécanisme HTTP pour vérifier la pertinence des ressources en cache via les en-têtes conditionnels If-None-Match et If-Modified-Since.
  • 304 Not Modified — une réponse du serveur indiquant que la ressource n’a pas changé. Le corps de la réponse n’est pas transmis, économisant trafic et temps de chargement.
  • ETag vs Last-Modified — ETag est plus précis (hash de contenu), Last-Modified est plus simple (date). Il est recommandé de combiner les deux pour une efficacité maximale.
  • Économie de trafic — pour les ressources inchangées, Conditional GET réduit le volume de données transmises de 70–95% selon la taille de la ressource.
  • Applications — mécanisme de synchronisation standard dans Twitter, Instagram, Telegram et la plupart des API REST modernes.
  • Intégration — côté client, le stockage d’ETag dans une base de données locale est nécessaire ; côté serveur, la génération et la comparaison d’ETag à chaque requête.
  • Recommandation — implémentez Conditional GET pour tous les endpoints GET de votre API mobile. C’est l’optimisation la moins coûteuse avec le plus grand impact pour les utilisateurs.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi