ETag — resurs versiyasining noyob identifikatorini o'z ichiga olgan HTTP javob sarlavhasi. Server ETag'ni tarkibning xeshi yoki versiya raqami sifatida yaratadi va ma'lumotlar bilan birga mijozga qaytaradi. Keyingi so'rovlarda mijoz ushbu identifikatorni If-None-Match sarlavhasida yuboradi, bu esa serverga resurs o'zgarganligini tekshirish imkonini beradi. MDN Web Docs, 2025 ma'lumotlariga ko'ra, ETag HTTP'dagi shartli GET so'rovlari mexanizmining asosidir. ETag bilan shartli so'rovlar mobil ilovalarni sinxronizatsiya qilishda uzatiladigan ma'lumotlar hajmini 90% gacha kamaytiradi.
Asosiy ma'lumotlar
ETag (Entity Tag) — keshlangan resurslarni validatsiya qilishni ta'minlaydigan shartli sarlavhalar oilasidan HTTP sarlavhasi. Server ETag'ni xesh yig'indisi (MD5, SHA-256) yoki resursning versiya raqami sifatida hisoblaydi va GET so'roviga javobda qaytaradi. Mijoz ETag'ni ma'lumotlar bilan birga saqlaydi va keyingi so'rovda uni If-None-Match sarlavhasida yuboradi. Agar resurs tarkibi o'zgarmagan bo'lsa, server javob tanasisiz 304 Not Modified holati bilan javob beradi.
Mobil ilovalar uchun ETag juda muhim, chunki u yuklab olinadigan ma'lumotlar hajmini kamaytiradi. Har bir ishga tushirish yoki sinxronizatsiyada ilova resurslarning dolzarbligini If-None-Match bilan so'rov orqali tekshiradi — to'liq ma'lumotlarni yuklash o'rniga 304 oladi va mahalliy nusxadan foydalanadi. Google Chrome Team (2024) ma'lumotlariga ko'ra, mobil API'larda ETag'dan foydalanish ro'yxatlar uchun o'rtacha javob hajmini 87% ga, alohida ob'yektlar uchun 94% ga kamaytiradi.
ETag server tomonidan yaratiladi va ham deterministik (bir xil tarkib uchun bir xil, bu umumiy keshlar uchun foydali), ham har bir javob uchun noyob (qat'iy validatsiya uchun) bo'lishi mumkin. Mobil sinxronizatsiya uchun mo'ljallangan REST API'larda eng ko'p tarkib xeshi va ma'lumotlar bazasidagi yozuvning versiya raqami kombinatsiyasi ishlatiladi.
Kuchli ETag (strong ETag) — tarkibdagi har qanday o'zgarishda, jumladan ahamiyatsiz (bo'shliqlar, formatlash) o'zgarishlarda o'zgaradigan identifikatorlar. Format: "abc123def" (qo'shtirnoq ichida, prefikssiz). Kuchli ETag'lar resursning baytma-bayt o'zgarmaganligini kafolatlaydi. Ular diapazon so'rovlari (Range requests) va qisman yuklab olishlarning yaxlitligini tekshirish uchun majburiydir.
Kuchsiz ETag (weak ETag) — W/ prefiksli identifikatorlar, masalan W/"abc123def". Ular bayt tasviri farq qilsa ham, resursning semantik ekvivalentligini tan oladi. Kuchsiz ETag'lar turli bo'shliqlar yoki formatlash bilan dinamik javoblar yaratadigan serverlar uchun foydali. Biroq, kuchsiz ETag'lar diapazon so'rovlarini qo'llab-quvvatlamaydi.
ETag turlarini taqqoslash:
| Xususiyat | Kuchli ETag | Kuchsiz ETag |
|---|---|---|
| Format | "hash" | W/"hash" |
| Sezgirlik | Baytma-bayt | Semantik |
| Diapazon so'rovlari | Qo'llab-quvvatlanadi | Qo'llab-quvvatlanmaydi |
| CDN keshlash | Ideal | Cheklangan |
| Sinxronizatsiya | Yuqori aniqlik | To'qnashuvlarga ruxsat beradi |
Last-Modified — resursning oxirgi o'zgarish sanasi va vaqtini ko'rsatadigan HTTP sarlavhasi. Mijoz uni If-Modified-Since sarlavhasida qaytaradi. Last-Modified amalga oshirish uchun soddaroq (serverga faqat sana kerak), ammo fundamental cheklovlarga ega: bir soniya aniqlik (bir soniya ichida ikkita o'zgarish farqlanmaydi) va bir vaqtning o'zida tarkibning o'zgarganligini aniqlay olmaslik (masalan, backup'dan tiklangandan keyin).
ETag bu muammolarni hal qiladi: tarkibning xeshi vaqtdan qat'iy nazar har bir o'zgarishda o'zgaradi. Shuning uchun zamonaviy REST API'lar ikkala sarlavhaning kombinatsiyasidan foydalanadi: ETag aniq validatsiya uchun va Last-Modified CDN'da taxminiy filtrlash uchun. Apache HTTP Server va Nginx statik fayllar uchun ikkala sarlavhani sukut bo'yicha yaratadi.
Sinxronizatsiyali mobil ilovalar uchun ETag muhimroq, chunki u tahrirlash mojarolarini aniqlash imkonini beradi. Agar mijoz If-Match: "etag" sarlavhasi bilan PUT so'rovini yuborsa, resurs boshqa mijoz tomonidan o'zgartirilgan bo'lsa server so'rovni rad etadi (optimistik blokirovka). Last-Modified soniya aniqligi tufayli bunday ishonchlilikni kafolatlay olmaydi.
Mobil ilovada ETag'ning mijoz tomonidan amalga oshirilishini Kotlin'da Retrofit va OkHttp yordamida ko'rib chiqamiz. Har bir GET so'rovida mijoz javobdan ETag'ni saqlaydi va keyingi so'rovda uni If-None-Match sarlavhasida yuboradi. Agar server 304 qaytarsa, ma'lumotlar qayta yuklanmaydi.
ETag keshlash bilan OkHttp mijozini sozlash:
class EtagClient {
private val etagCache =
mutableMapOf<String, String>()
private val client = OkHttpClient.Builder().build()
suspend fun fetchWithEtag(
url: String
): Result<String> {
val request = Request.Builder()
.url(url)
.header("If-None-Match",
etagCache[url] ?: "")
.build()
val response = client.newCall(request).await()
return when (response.code) {
304 -> Result.success(
"not_modified")
200 -> {
response.header("ETag")?.let {
etagCache[url] = it
}
Result.success(response.body?.string()
?: "")
}
else -> Result.failure(
Exception("HTTP ${response.code}"))
}
}
}
Mijoz muvaffaqiyatli 200 javobidan keyin ETag'ni saqlaydi va keyingi so'rovda uni If-None-Match sarlavhasida yuboradi. 304 da mijoz mahalliy versiya dolzarb ekanligini biladi va ma'lumotlarni qayta yuklash uchun trafik sarflamaydi. Ushbu naqsh tez-tez so'raladigan resurslar uchun mobil ilovaning tarmoq xarajatlarini 80–90% kamaytiradi.
ETag mobil ilovalarning REST API bilan sinxronizatsiyasini optimallashtirish uchun asosiy mexanizmdir. Standart sinxronizatsiya sxemasida mijoz avval ETag validatsiyasi bilan resurslar ro'yxatini so'raydi — agar hech qanday resurs o'zgarmagan bo'lsa, server 304 qaytaradi va mijoz sinxronizatsiyani yakunlaydi. Agar o'zgarishlar bo'lsa, server faqat o'zgartirilgan resurslarni qaytaradi. Ushbu yondashuv delta-sinxronizatsiya deb ataladi va cheklangan trafikli mobil qurilmalar uchun juda muhimdir.
Optimistik blokirovka stsenariylarida ETag Lost Update mojarolarining oldini olish uchun ishlatiladi. Mijoz resursni yangilash uchun PUT so'rovini yuborganida, If-Match: "etag" sarlavhasini qo'shadi. Agar ETag mos kelmasa (boshqa mijoz resursni allaqachon o'zgartirgan bo'lsa), server 412 Precondition Failed bilan javob beradi va mijoz dolzarb versiyani qayta yuklab, o'zgarishni takrorlashi kerak. Ushbu yondashuv ma'lumotlar bazasi darajasida blokirovkalarsiz ma'lumotlar izchilligini ta'minlaydi.
Oflayn rejimli taqsimlangan tizimlar uchun ETag Conflict Resolution bilan birgalikda ishlatiladi. Mijoz barcha resurslar uchun joriy ETag'larni olib sinxronizatsiya qiladi. O'zgarishlarni yuborishda server If-Match'ni tekshiradi — agar ETag mos kelmasa, tanlangan strategiyaga (LWW, Merge) muvofiq hal qilinadigan mojaro qayd etiladi. Postman API Report (2025) ma'lumotlariga ko'ra, mobil ilovalar uchun ishlab chiqarish REST API'larining 67% i ETag'dan asosiy versiya validatsiya mexanizmi sifatida foydalanadi.
Tez-tez beriladigan savollar
ETag — resurs versiyasining noyob identifikatorini o'z ichiga olgan HTTP javob sarlavhasi. Mijoz uni shartli so'rovlar uchun ishlatadi: resurs o'zgarmagan bo'lsa, server javob tanasisiz 304 Not Modified qaytaradi va trafikni tejaydi.
ETag aniq taqqoslash uchun tarkib xeshidan foydalanadi. Last-Modified soniya aniqligi bilan o'zgartirish sanasiga asoslanadi. ETag haqiqiy o'zgarishlarni aniqlashda ishonchliroq va If-Match orqali optimistik blokirovkani qo'llab-quvvatlaydi.
Kuchli ETag (prefikssiz) resurslarni baytma-bayt farqlaydi. Kuchsiz ETag (W/ prefiksi bilan) semantik ekvivalentlikka ruxsat beradi. Kuchlilari diapazon so'rovlari uchun talab qilinadi, kuchsizlari dinamik yaratilgan tarkib uchun.
ETag trafikni 80–90% kamaytiradi: mijoz barcha resurslarning dolzarbligini If-None-Match orqali tekshiradi, faqat o'zgarganlarini yuklaydi. ETag bo'lmasa, mijoz har bir sinxronizatsiyada to'liq ma'lumotlarni yuklab, trafik va batareyani sarflagan bo'lardi.
Server ETag'ni javob tarkibining xeshi (MD5, SHA-256) sifatida hisoblaydi yoki ma'lumotlar bazasidagi yozuvning versiya raqamidan foydalanadi. Spring Boot'da @Cacheable annotatsiyasi etag = true bilan yetarli. Express.js'da etag middleware'i sukut bo'yicha yoqilgan.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.