Conditional GET (şərti GET sorğusu) — müştəriyə tam yükləmədən öncə keşlənmiş resursun aktuallığını yoxlamağa imkan verən HTTP mexanizmidir. Müştəri If-None-Match (ETag ehtiva edir) və ya If-Modified-Since (tarix ehtiva edir) başlıqları ilə GET sorğusu göndərir və resurs dəyişməyibsə, server cavab gövdəsi olmadan 304 Not Modified qaytarır. MDN Web Docs, 2025-ə görə, şərti sorğular server və müştərilərin şəbəkə trafikini azaldır. 304 Not Modified — mobil tətbiqlərin effektiv sinxronizasiyası üçün əsas HTTP statusudur.
Əsas məqamlar
Conditional GET — bir və ya bir neçə şərti başlıq ehtiva edən GET sorğusudur. Bu başlıqlar əsasında server tam cavab qaytarmaq və ya yalnız 304 Not Modified statusu göndərmək qərarı verir. Əsas məqsəd — resurs son sorğudan bəri dəyişməyibsə, cavab gövdəsinin ötürülməsindən qaçmaqdır. Bu, RFC 7232 spesifikasiyasında müəyyən edilmiş HTTP keşləməsinin fundamental mexanizmidir.
Mobil tətbiqlər üçün Conditional GET şəbəkə trafikinin optimallaşdırılmasının ən effektiv yollarından biridir. Tipik ssenari: tətbiq açıldıqda müştəri lent, profil və parametrləri yükləmək üçün bir sıra şərti GET sorğuları göndərir. Məlumat dəyişməyibsə, tətbiq 304 alır və yerli surətdən istifadə edir. Bu, saniyələr əvəzinə millisaniyələr çəkir və mobil trafik sərf etmir.
Google Web Fundamentals (2025) məlumatına görə, mobil tətbiqdə şərti GET sorğularının tətbiqi təkrar ziyarətlər üçün orta yükləmə müddətini 40–60% azaldır və nadir yenilənən səhifələr üçün trafik sərfini 70–90% azaldır. Effekt xüsusilə yavaş bağlantılarda (3G, Edge) nəzərə çarpır, burada hər bayt əhəmiyyətlidir.
Proses üç addımdan ibarətdir. Birinci — müştəri adi GET sorğusu göndərir, server resursu keşləmə başlıqları (ETag, Last-Modified) ilə birlikdə qaytarır. İkinci — müştəri resursu və onun validatorlarını lokal olaraq saxlayır. Üçüncü — təkrar sorğuda müştəri If-None-Match (ETag üçün) və/və ya If-Modified-Since (Last-Modified üçün) ilə GET göndərir. Server validatorları yoxlayır və resurs dəyişməyibsə 304, yeni məlumat varsa 200 cavabı qaytarır.
Server hər iki başlıq mövcud olduqda ETag-ə Last-Modified-dən üstünlük verir. Bu, ETag-in daha dəqiq validasiya təmin etməsi ilə bağlıdır — məzmun heşi istənilən dəyişiklikdə dəyişir, halbuki Last-Modified bir saniyə dəqiqliyə malikdir. ETag uyğun gələrsə, server dərhal 304 qaytarır, Last-Modified-i yoxlamır.
Sorğu ardıcıllığında Conditional GET-in tam dövrü nümunəsi:
// Addım 1: İlk sorğu — məlumatları və ETag-i əldə edin
GET /api/profile
Response: 200 OK
ETag: "33a64df551425fcc55e"
Body: { "name": "Alice" }
// Addım 2: Sorğunu təkrarlayın — If-None-Match ilə
GET /api/profile
If-None-Match: "33a64df551425fcc55e"
Response: 304 Not Modified
// Cavab gövdəsi yoxdur — yerli surətdən istifadə edin
İkinci sorğuda server If-None-Match-dəki ETag-i resursun cari heşi ilə müqayisə edir. Uyğunluq halında 304 cavabsız qaytarılır — müştəri keşlənmiş məlumatlardan istifadəyə davam edir. Conditional GET-in mahiyyəti budur: maksimum məlumat aktuallığı ilə minimum trafik.
Adi GET sorğusu həmişə gövdə ilə tam 200 OK cavabı qaytarır. Resurs dəyişməsə belə, server bütün məlumatları yenidən ötürür. Bu, kiçik resurslar və ya nadir sorğular üçün məqbuldur, lakin hər açılışda yüzlərlə sorğu göndərən mobil tətbiqlər üçün bu yanaşma həddindən artıq trafik və batareya sərfinə səbəb olur.
Conditional GET başlıqlar şəklində əlavə yük əlavə edir (adətən sorğuya 50–200 bayt), lakin 304 cavabında kilobayt və meqabaytlara qənaət edir. Resurs nə qədər böyükdürsə, şərti sorğu bir o qədər sərfəlidir. 10 KB-dan böyük şəkillər, məlumat siyahıları və JSON sənədləri üçün Conditional GET ilk təkrar sorğuda özünü doğruldur.
İki yanaşmanın müqayisəsi:
| Parametr | Adi GET | Conditional GET |
|---|---|---|
| Trafik (dəyişiklik yoxdur) | Tam cavab | Yalnız başlıqlar (~200 bayt) |
| Gecikmə | Tam yükləmə | Millisaniyələr (304) |
| Server yükü | Generasiya + ötürmə | Yalnız ETag yoxlaması |
| Tətbiq mürəkkəbliyi | Minimal | ETag saxlanması tələb olunur |
| Böyük məlumatlar üçün səmərəlilik | Aşağı | Yüksək |
Tam tətbiqi nəzərdən keçirək — OkHttp və ETag saxlamaq üçün Room istifadə edərək Kotlin-də Conditional GET. Tapşırıq siyahısı tətbiqi serverdən tapşırıqları yükləyir və trafiki minimuma endirmək üçün şərti sorğulardan istifadə edir. ETag-lər sessiyalar arasında qorunmaq üçün lokal verilənlər bazasında saxlanılır.
Kotlin-də Conditional GET ilə depozitari:
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() // lokal keşdən
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 cavab kodunu yoxlayır: 304 dəyişiklik olmadığını bildirir və məlumatlar Room-un lokal keşindən qaytarılır. 200-də yeni ETag saxlanılır və tapşırıqlar lokal bazada yenilənir. Bu nümunə REST API vasitəsilə sinxronizasiya edən mobil tətbiqlər üçün standartdır.
Conditional GET geniş istifadə olunur mobil tətbiqlərdə məlumat sinxronizasiyasını optimallaşdırmaq üçün. Əsas ssenarilər: xəbər lentinin yüklənməsi (Twitter, Instagram dövri olaraq API-ni If-None-Match ilə sorğulayır), istifadəçi profilinin yenilənməsi, bildiriş siyahısının yüklənməsi və tapşırıqların sinxronizasiyası. Hər bir halda tətbiq məlumatları yenidən yükləmədən aktuallığını yoxlaya bilər.
Offline-first tətbiqləri üçün Conditional GET sinxronizasiyanın ilk mərhələsi kimi xidmət edir. Tətbiq əvvəlcə son sinxronizasiyadan bəri lokal olaraq dəyişdirilmiş bütün resurslar üçün şərti GET sorğuları göndərir. 304 olan resurslar yükləmə tələb etmir. Bundan sonra tətbiq lokal dəyişikliklər üçün PUT/POST göndərir. Belə iki fazalı yanaşma minimal trafik sərfini təmin edir.
Conflict Resolution ilə birlikdə Conditional GET münaqişələri effektiv aşkarlamağa imkan verir. Əgər müştəri yeni məlumatlarla 200 alıbsa (resurs dəyişib), lakin müştərinin göndərilməmiş lokal dəyişiklikləri varsa — münaqişə qeydə alınır. Müştəri LWW tətbiq edə bilər (lokal dəyişikliklər itir) və ya lokal və uzaq dəyişiklikləri birləşdirmək üçün Merge Strategy işə sala bilər. Meta Engineering Blog (2025) məlumatına görə, Messenger-də Conditional GET-in tətbiqi sinxronizasiya üzrə orta trafik sərfini 73% azaldıb.
Tez-tez verilən suallar
Conditional GET — şərti başlıqları (If-None-Match, If-Modified-Since) olan HTTP GET sorğusudur. Resurs dəyişməyibsə, server 304 Not Modified, yeni məlumat varsa 200 qaytarır. Bu effektiv keşləmə mexanizmidir.
Adi GET həmişə gövdə ilə tam cavab qaytarır. Conditional GET versiya yoxlama başlıqları (ETag, tarix) əlavə edir. Məlumat dəyişməyibsə, server gövdəsiz 304 cavabı verir, trafikə və yükləmə vaxtına qənaət edir.
Effektiv keşləmə üçün hər server cavabından ETag və Last-Modified-i lokal verilənlər bazasında saxlayın. Növbəti sorğuda onları If-None-Match və If-Modified-Since başlıqlarında göndərin. 304 aldıqda lokal keşdən məlumatlardan istifadə edin.
304 cavabında server cavab gövdəsini ötürmür — yalnız başlıqlar (~200 bayt). 50 KB ölçüsündə resurs üçün bu 99,6% trafik qənaəti deməkdir. Gündə 50 dəfə sinxronizasiya edən tətbiq üçün qənaət ayda onlarla meqabayta çatır.
Bəli, bu standart yanaşmadır delta-sinxronizasiya üçün. Müştəri hər resursun aktuallığını Conditional GET vasitəsilə yoxlayır, yalnız dəyişmiş resursları yükləyir və lokal dəyişiklikləri göndərir. Bu yanaşma Twitter, Instagram, Telegram və müasir API-lərin əksəriyyətində istifadə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun