GraphQL — bu nima, so'rov tili va mobil loyihalarda qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-03-06 O'qish vaqti: 9 daq

GraphQL — bu API uchun so'rov tili va ushbu so'rovlarni bajarish uchun ishga tushirish muhiti bo'lib, Facebook tomonidan 2012 yilda ishlab chiqilgan va 2015 yilda ochiq kod sifatida chiqarilgan. REST dan farqli o'laroq, server javob tuzilishini belgilaydi, GraphQL mijozga qanday ma'lumotlar kerakligini aniq ko'rsatishga imkon beradi, overfetching va underfetching muammolarini butunlay bartaraf qiladi. State of JavaScript Survey (2025) ma'lumotlariga ko'ra, GraphQL so'rovda qatnashgan dasturchilarning 35% tomonidan ishlatiladi va yirik kompaniyalar orasida uni GitHub, Shopify, Airbnb va The New York Times joriy qilgan. GraphQL uch turdagi operatsiyalarni qo'llab-quvvatlaydi: query (o'qish), mutation (yozish) va subscription (WebSocket orqali real-time yangilanishlar).

Asosiy fikrlar

  • GraphQL — mijoz javob tuzilishini belgilaydigan so'rov tili
  • Overfetching (ortiqcha ma'lumot) va underfetching (ma'lumot yetishmasligi) muammolarini hal qiladi
  • Turli xil operatsiyalar uchun query, mutation va subscription ni qo'llab-quvvatlaydi
  • REST dagi kabi ko'plab URL lar o'rniga yagona endpoint (odatda /graphql) ishlatadi
  • Qattiq sxemaga ega tip tizimiga asoslangan: barcha mumkin bo'lgan ma'lumotlar oldindan tavsiflangan

GraphQL nima?

GraphQL — bu API uchun spetsifikatsiya va ijro muhiti bo'lib, mijozga olingan ma'lumotlar ustidan to'liq nazorat beradi. Facebook muhandislari tomonidan News Feed mobil ilovasi muammolarini hal qilish uchun ishlab chiqilgan, spetsifikatsiya 2015 yilda ochiq standart sifatida nashr etilgan. 2018 yildan boshlab GraphQL Linux Foundation va Apollo, AWS, GitHub, SAP va boshqa kompaniyalar ko'magi bilan GraphQL Foundation tomonidan boshqariladi.

REST dan farqli o'laroq, har bir endpoint qat'iy ma'lumot strukturasini qaytaradi, GraphQL so'rov qatorini qabul qiladigan yagona endpoint dan foydalanadi. Mijoz so'rovda qanday maydonlar kerakligini tavsiflaydi va server aynan ularni qaytaradi. Masalan, { user(id: “1”) { name email } } so'rovi foydalanuvchining faqat name va email maydonlarini qaytaradi, REST da olinishi kerak bo'lgan address, phone yoki createdAt kabi ortiqcha maydonlarsiz.

GraphQL hech qanday ma'lumotlar bazasi yoki tilga bog'liq emas. Spetsifikatsiya faqat so'rov va javob formatini belgilaydi. Node.js (graphql-js, Apollo Server), Kotlin (graphql-kotlin, Netflix DGS Framework), Python (Graphene, Strawberry), Ruby (graphql-ruby) va boshqa tillarda server ilovalari mavjud. Mijoz kutubxonalari iOS, Android va Web uchun Apollo Client ni o'z ichiga olgan holda barcha asosiy platformalar uchun mavjud.

GraphQL qanday ishlaydi

GraphQL arxitekturasi uchta asosiy komponentdan iborat: sxema (Schema), rezolvarlar (Resolvers) va ijro mexanizmi (GraphQL Engine). Sxema qanday ma'lumot turlari mavjudligini, qanday so'rovlarni bajarish mumkinligini va qanday argumentlarni qabul qilishini belgilaydi. Rezolvarlar server tomonida sxemaning har bir maydoni uchun ma'lumot qaytaradigan funksiyalardir. Ijro mexanizmi kiruvchi so'rovni qabul qiladi, uni sxema bo'yicha tekshiradi, tegishli rezolvarlarni chaqiradi va javobni tuzadi.

So'rovni qayta ishlash jarayoni quyidagicha:

  • Mijoz /graphql manziliga JSON tanasi { “query”: “...” } bilan POST so'rovi yuboradi
  • Server so'rovni tahlil qiladi, AST (Abstract Syntax Tree) quradi va uni sxema bo'yicha tekshiradi
  • Mexanizm AST bo'ylab harakatlanib, har bir maydon uchun rezolvarlarni chaqiradi va ma'lumotlarni to'playdi
  • Javob so'rov tuzilishiga qat'iy mos keladigan JSON formatida qaytariladi

GraphQL arxitekturasining asosiy afzalligi maydon darajasida hal qilishdir. REST da dasturchi resursning barcha maydonlarini oladi (ehtimol ortiqcha), yoki ?fields=name,email kabi kengaytmalarga murojaat qiladi. GraphQL da bunday filtrlash tilga o'rnatilgan: har bir so'rov qaysi maydonlar kerakligini aniq belgilaydi va server aynan ularni qaytaradi. Bu uzatiladigan ma'lumotlar hajmi yuklash tezligi va trafik sarfiga bevosita ta'sir qiladigan mobil ilovalar uchun ayniqsa muhimdir.

Query, Mutation va Subscription

GraphQL uch turdagi operatsiyalarni belgilaydi, ularning har biri ma'lum o'zaro ta'sir ssenariysiga mos keladi. Query — ma'lumotlarni o'qish uchun, REST dagi GET ga o'xshaydi. Mutation — ma'lumotlarni o'zgartirish uchun (yaratish, yangilash, o'chirish), POST/PUT/DELETE ga o'xshaydi. Subscription — WebSocket orqali real-time yangilanishlar uchun, klassik REST da to'g'ridan-to'g'ri o'xshashi yo'q (WebSocket yoki Server-Sent Events kabi qo'shimcha yechimlarni talab qiladi).

So'rovlarning asosiy sintaksisi intuitivdir:

js
// Oddiy so'rov argument bilan
query {
    user(id: "42") {
        name
        email
        avatarUrl
    }
}

// O'zgartirilgan ma'lumotlarni qaytaruvchi mutation
mutation {
    updateProfile(name: "Ivan") {
        id
        name
        updatedAt
    }
}

// Subscription — real-time yangilanishlarni tinglaydi
subscription {
    newMessage(chatId: "chat_1") {
        id
        text
        sender { name }
    }
}

Query parallel bajariladi — bir xil darajadagi barcha maydonlar bir vaqtda yuklanadi. Bu bog'liq ma'lumotlarni (foydalanuvchi va uning postlari) bir nechta round-trip larsiz bitta so'rov bilan yuklash imkonini beradi. Mutation ketma-ket bajariladi — bitta so'rovdagi mutatsiyalar e'lon qilish tartibida birin-ketin bajariladi. Subscription WebSocket orqali doimiy aloqa o'rnatadi, server hodisa yuz berganda ma'lumot yuboradi.

Operatsiyalar ma'lumotlarni so'rovdan ajratish uchun o'zgaruvchilar, maydonlarni shartli kiritish uchun direktivalar (@include, @skip) va maydon to'plamlarini qayta ishlatish uchun fragmentlar ni qabul qilishi mumkin. Bu imkoniyatlar GraphQL so'rovlarini moslashuvchan va qayta ishlatiladigan qiladi, bu ko'plab ekran va komponentlarga ega yirik loyihalarda ayniqsa muhimdir.

GraphQL sxemasi va tip tizimi

GraphQL ning asosida API ning barcha mumkin bo'lgan ma'lumotlari va operatsiyalarini tavsiflovchi tip tizimi yotadi. Sxema (Schema) server qaytarishi mumkin bo'lgan turlarning va qabul qiladigan so'rovlarning tavsifidir. Sxema Schema Definition Language (SDL) tilida yoziladi va mijoz bilan server o'rtasidagi shartnoma vazifasini bajaradi. Mijoz sxemani introspeksiya orqali olishi mumkin — API ning to'liq tavsifini qaytaradigan __schema maxsus so'rovi.

Blog uchun sxema namunasi:

js
// SDL — Schema Definition Language
type User {
    id: ID!
    name: String!
    email: String
    posts: [Post!]!
}

type Post {
    id: ID!
    title: String!
    content: String
    author: User!
}

type Query {
    user(id: ID!): User
    posts(page: Int): [Post!]!
}

Undov belgisi (!) non-null maydonni bildiradi — javobda albatta bo'ladi. Kvadrat qavslar [ ] ro'yxatni bildiradi. GraphQL skalyar turlarni (Int, Float, String, Boolean, ID), obyekt turlarini, enum, union, interface va input-turlarini (mutatsiya argumentlari uchun) qo'llab-quvvatlaydi. Qattiq tiplashtirish API ni o'z-o'zidan hujjatlashtiradi va mijoz vositalariga kod yaratish imkonini beradi: TypeScript turlari, Kotlin ma'lumot sinflari, Swift tuzilmalari.

Introspeksiya — REST da mavjud bo'lmagan GraphQL ning noyob xususiyatidir. Mijoz sxemaga so'rov yuborib, barcha turlar, maydonlar, argumentlar va direktivalarning to'liq tavsifini olishi mumkin. Bu dasturchilar uchun avtomatik hujjatlashtirish va avtotoldirishni yaratadigan GraphiQL va Apollo Studio kabi vositalarning asosini tashkil qiladi. Introspeksiya, shuningdek, sxemaning kutilgan tuzilishga muvofiqligini tekshiruvchi avtomatik testlar yozish imkonini beradi.

GraphQL ni REST bilan solishtirish

GraphQL va REST o'rtasidagi tanlov API ni loyihalashda asosiy arxitektura savollaridan biridir. Ikkala yondashuvning o'z kuchli va zaif tomonlari bor va tanlov loyihaning o'ziga xos talablariga bog'liq. REST soddalik va universallikda, GraphQL esa moslashuvchanlik va so'rov samaradorligida ustunlik qiladi. Keling, solishtirish jadvalini ko'rib chiqaylik.

MezonRESTGraphQL
Javob tuzilishiQat'iy, server tomonidanMoslashuvchan, mijoz tomonidan
OverfetchingTez-tez — server barcha maydonlarni qaytaradiYo'q — mijoz faqat keraklilarini so'raydi
So'rovlar soniBir nechta round-trip larBarcha ma'lumotlar uchun bitta so'rov
KeshlashMahalliy HTTP keshlashQo'lda sozlashni talab qiladi
TiplashtirishO'rnatilmagan (formatga bog'liq)Qattiq, SDL sxemasi orqali
Vositalarcurl, Postman, SwaggerGraphiQL, Apollo Studio, Introspection
Fayl yuklashMultipart orqali mahalliyQo'shimcha protokollarni talab qiladi
SamaradorlikBashorat qilish mumkin, optimallashtirish osonIchki so'rovlarning murakkabligiga bog'liq

GraphQL ning asosiy kamchiligi keshlashning qiyinligidir. REST da HTTP keshlash URL darajasida ishlaydi: /api/users/42 manziliga bitta so'rov har doim bir xil tuzilmani qaytaradi va javob URL bo'yicha keshlanishi mumkin. GraphQL da barcha so'rovlar bitta endpointga boradi, javob tuzilishi so'rov mazmuniga bog'liq. Bu muammoni hal qilish uchun Apollo Client mijoz tomonida normallashtirilgan keshlashdan foydalanadi, u javoblarni id bo'yicha alohida ob'ektlarga ajratadi va yangi ma'lumot olinganda ularni avtomatik yangilaydi.

Yana bir muhim jihat N+1 muammosidir. Ichma-ich ma'lumotlarni so'rashda (masalan, foydalanuvchi postlari va har bir postga sharhlar) GraphQL ro'yxatning har bir elementi uchun alohida SQL so'rovini bajarishi mumkin. Bu DataLoader — ma'lumotlar bazasi so'rovlarini to'plash va keshlash vositasi bilan hal qilinadi, u alohida so'rovlarni bitta guruhli so'rovga birlashtiradi. REST da bu muammo kamroq seziladi, chunki dasturchi server tomonida javob tuzilishini nazorat qiladi.

GraphQL so'rov misollari

Apollo Client bilan Kotlin da mobil ilovada GraphQL dan amaliy foydalanish misollarini ko'rib chiqaylik. Misollar odatiy stsenariylarni namoyish qiladi: profil ekrani uchun ma'lumotlarni yuklash (query), yangi post yaratish (mutation) va yangi sharhlarga obuna bo'lish (subscription). Har bir misol GraphQL so'rovi va mijoz tomonidagi kodni o'z ichiga oladi.

Query: profil va postlarni yuklash

Bitta GraphQL so'rovi foydalanuvchini, uning oxirgi postlarini va kuzatuvchilarning umumiy sonini yuklaydi. REST da buning uchun kamida 2-3 so'rov kerak bo'ladi: /users/42, /users/42/posts, /users/42/stats. GraphQL ularni bitta round-trip da birlashtirib, sekin ulanishlarda ekranni yuklash vaqtini qisqartiradi.

kotlin
// GraphQL so'rovi (.graphql faylida)
query ProfileScreen($userId: ID!) {
    user(id: $userId) {
        name
        bio
        avatarUrl
        posts(limit: 10) {
            id
            title
            createdAt
        }
        followersCount
        followingCount
    }
}

// Mijoz tomonida chaqirish (Apollo Client + Kotlin)
val response = apolloClient
    .query(ProfileScreenQuery(userId = "42"))
    .execute()
binding.nameText.text = response.data?.user?.name

Mutation: yangi post yaratish

Mutatsiya nafaqat resursni yaratadi, balki UI ni yangilash uchun uning dolzarb ma'lumotlarini qaytaradi. __typename maydoni Apollo Client tomonidan keshlashni normallashtirish uchun ishlatiladi — mijoz mutatsiyaning muvaffaqiyatli javobidan so'ng keshdagi Post yozuvini avtomatik yangilaydi.

kotlin
// GraphQL mutatsiyasi
mutation CreatePost($input: CreatePostInput!) {
    createPost(input: $input) {
        id
        title
        createdAt
        author {
            id
            name
        }
    }
}

// Input-tipi bilan mutatsiyani chaqirish
val input = CreatePostInput(
    title = "GraphQL haqida yangi post",
    content = "GraphQL API bilan ishlashni soddalashtiradi..."
)
val result = apolloClient
    .mutation(CreatePostMutation(input))
    .execute()

GraphQL ning mobil ishlanma kontekstida REST dan muhim ustunligi avtomatik kod yaratishdir. Kotlin uchun Apollo Client (Apollo GraphQL) qurish bosqichida .graphql fayllaridan tip-xavfsiz sinflarni yaratadi. Agar server sxemani o'zgartirsa, loyiha so'rovlar yangilanmaguncha qurilmaydi. Bu REST ga xos bo'lgan, javob tuzilishining o'zgarishi ishlab chiqish vaqtida sezilmaydigan ish vaqti xatolarining oldini oladi.

Ekotizim: Apollo, Relay va vositalar

GraphQL ekotizimi ishlab chiqish va foydalanishni soddalashtiradigan bir nechta asosiy kutubxona va vositalarni o'z ichiga oladi. Apollo Client — React, iOS, Android va Kotlin Multiplatform ni qo'llab-quvvatlovchi eng ommabop mijoz kutubxonasi. Facebook ning Relay mahsuloti — ma'lumotlarni boshqarish va keshlashga noyob yondashuvga ega React ilovalari uchun alternatividir. Apollo va Relay o'rtasidagi tanlov platforma va ishlash talablariga bog'liq.

Server tomonida Apollo Server (Node.js), Netflix DGS Framework (Kotlin/Java) va graphql-ruby yetakchilik qiladi. Sxemani ishlab chiqish va so'rovlarni sinash uchun GraphiQL — brauzerga o'rnatilgan interaktiv IDE ishlatiladi. Apollo Studio ishlab chiqarish muhiti uchun samaradorlik ko'rsatkichlari, so'rovlarni kuzatish va sxemani boshqarishni ta'minlaydi. Alohida GraphQL Code Generator — SDL sxemasidan TypeScript, Kotlin, Swift va Dart turlarini yaratadigan vositani eslatib o'tish kerak.

Mobil ishlanma uchun alohida qiziqish uyg'otadigan Apollo Kotlin (Apollo GraphQL) — to'liq Kotlin da korutin, Flow va Multiplatform qo'llab-quvvatlashi bilan yozilgan kutubxonadir. U Kotlin Multiplatform loyihalarida Android va iOS uchun yagona GraphQL so'rovlaridan foydalanish imkonini beradi. Apollo Kotlin keshlashni normallashtiradi, maydon darajasidagi xatolarni (partial errors) qo'llab-quvvatlaydi va .graphql fayllaridan avtomatik ma'lumot modellarini yaratadi. Bu GraphQL ni ishlab chiqish tezligi va tip xavfsizligi muhim bo'lgan yirik mobil loyihalar uchun afzal tanlovga aylantiradi.

Tez-tez so'raladigan savollar

GraphQL REST o'rnini bosadimi?

GraphQL REST o'rnini bosmaydi, balki muqobil yondashuvni taklif qiladi. REST sodda CRUD-API lar, HTTP orqali keshlash va bashorat qilinadigan yuklama bilan ochiq API lar uchun ko'proq mos keladi. GraphQL ko'plab bog'liq ma'lumotlarga ega murakkab interfeyslar uchun optimaldir.

REST dan GraphQL ga migratsiya qilish qiyinmi?

Migratsiya bosqichma-bosqich mumkin: GraphQL mavjud REST xizmatlari oldida oraliq qatlam (gateway) sifatida ishlashi mumkin. Ko'plab kompaniyalar eski API ni o'chirmasdan GraphQL ni REST yoniga qo'shadi. To'liq almashtirish rezolvarlarni qayta yozishni talab qiladi.

GraphQL da N+1 muammosi nima?

N+1 ro'yxatning har bir elementi uchun ma'lumotlar bazasiga alohida so'rov bajarilganda yuzaga keladi. DataLoader — alohida so'rovlarni bitta so'rovga birlashtiruvchi va natijalarni bitta HTTP so'rovi doirasida keshlovchi kutubxona bilan hal qilinadi.

GraphQL fayl yuklash bilan qanday ishlaydi?

GraphQL spetsifikatsiyasi fayl yuklashni to'g'ridan-to'g'ri belgilamaydi. Amalda ishlatiladi: base64 kodlash (sodda, lekin katta fayllar uchun samarasiz), graphql-multipart-request-spec protokoli bo'yicha multipart so'rovlari yoki fayllar uchun alohida REST endpoint.

GraphQL xavfsizmi?

GraphQL xavfsizligi qo'shimcha choralarni talab qiladi: ichki joylashish chuqurligini cheklash, so'rov murakkabligi limiti, operatsiyalar darajasida rate limiting. Sxemaning ochiq introspeksiyasi ma'lumotlar tuzilishini ochib berishi mumkin — ishlab chiqarish muhitida uni o'chirish tavsiya etiladi.

Xulosa

  • GraphQL — mijoz javob tuzilishini boshqaradigan, overfetching va underfetching ni bartaraf qiladigan so'rov tili
  • Uch turdagi operatsiyalar: query (o'qish), mutation (yozish), subscription (real-time)
  • Yagona endpoint va qattiq tip tizimi — SDL sxemasidan foydalanadi
  • REST dan farqli o'laroq, ko'plab round-trip muammosini hal qiladi — barcha ma'lumotlar bitta so'rovda
  • N+1 muammosini oldini olish uchun DataLoader va keshlashni qo'lda sozlashni talab qiladi
  • Asosiy mijozlar: Apollo Client (Android, iOS, Web) va Relay (React)
  • Ko'plab bog'liq ob'ektlarga ega murakkab interfeyslar va mobil ilovalar uchun eng mos keladi

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