Ilovalarda ETag — bu nima, maqsadi va printsipi

Muallif: IT Sectr Nashr etilgan: 2026-06-14 O'qish vaqti: 7 daq

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 — resurs versiyasining noyob identifikatorini, odatda uning tarkibining xeshini o'z ichiga olgan HTTP sarlavhasi.
  • If-None-Match — mijoz saqlangan ETag'ni yuboradi, resurs o'zgarmagan bo'lsa server 304 Not Modified qaytaradi.
  • Trafikni tejash — ETag bilan shartli so'rovlar mobil ilovalarni sinxronizatsiya qilishda ma'lumotlar hajmini kamaytiradi, chunki javob tanasi uzatilmaydi.
  • Kuchli va kuchsiz ETag — kuchlilari tarkibni baytma-bayt farqlaydi, kuchsizlari semantik ekvivalentlikka ruxsat beradi.
  • Qo'llanilishi — ETag REST API'da ma'lumotlarni sinxronizatsiya qilish, keshlash va tahrirlash mojarolarining oldini olish uchun ishlatiladi.

HTTP va mobil ilovalarda ETag nima?

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.

ETag turlari: kuchli va kuchsiz identifikatorlar

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:

XususiyatKuchli ETagKuchsiz ETag
Format"hash"W/"hash"
SezgirlikBaytma-baytSemantik
Diapazon so'rovlariQo'llab-quvvatlanadiQo'llab-quvvatlanmaydi
CDN keshlashIdealCheklangan
SinxronizatsiyaYuqori aniqlikTo'qnashuvlarga ruxsat beradi

ETag va Last-Modified: nimani tanlash kerak

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.

Kotlin'da ETag bilan ishlash misollari

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:

kotlin
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'ning mobil ilovalar sinxronizatsiyasidagi roli

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

HTTP ETag sarlavhasi nima?

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 va Last-Modified o'rtasidagi farq nima?

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 va kuchsiz ETag nima?

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 mobil sinxronizatsiyada qanday yordam beradi?

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.

Serverda ETag qanday amalga oshiriladi?

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

  • ETag — tarkib xeshiga yoki versiya raqamiga asoslangan resurs versiyalarini validatsiya qilish uchun HTTP sarlavhasi.
  • Shartli so'rovlar — mijoz saqlangan ETag bilan If-None-Match yuboradi, o'zgarishlar bo'lmasa server 304 javob beradi.
  • ETag turlari — kuchli (baytma-bayt, diapazon so'rovlari uchun) va kuchsiz (semantik ekvivalentlik, W/ prefiksi).
  • Afzallik — ETag Last-Modified'dan aniqroq, chunki xesh vaqtdan qat'iy nazar tarkibning har bir o'zgarishida o'zgaradi.
  • Optimistik blokirovka — If-Match orqali ETag resursning parallel tahrirlanishida Lost Update mojarolarining oldini oladi.
  • Delta-sinxronizatsiya — ETag asosida faqat o'zgargan resurslar uzatiladigan sinxronizatsiya sxemalari quriladi.
  • Tavsiya — mobil ilovalar uchun REST API'da har doim ETag qo'shing. CDN va proksi serverlar bilan moslik uchun Last-Modified bilan birlashtiring.

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.

Loyihani muhokama qilish

Shuningdek o'qing