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 — 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 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:
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.
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:
// 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 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:
// 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 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.
| Mezon | REST | GraphQL |
|---|---|---|
| Javob tuzilishi | Qat'iy, server tomonidan | Moslashuvchan, mijoz tomonidan |
| Overfetching | Tez-tez — server barcha maydonlarni qaytaradi | Yo'q — mijoz faqat keraklilarini so'raydi |
| So'rovlar soni | Bir nechta round-trip lar | Barcha ma'lumotlar uchun bitta so'rov |
| Keshlash | Mahalliy HTTP keshlash | Qo'lda sozlashni talab qiladi |
| Tiplashtirish | O'rnatilmagan (formatga bog'liq) | Qattiq, SDL sxemasi orqali |
| Vositalar | curl, Postman, Swagger | GraphiQL, Apollo Studio, Introspection |
| Fayl yuklash | Multipart orqali mahalliy | Qo'shimcha protokollarni talab qiladi |
| Samaradorlik | Bashorat qilish mumkin, optimallashtirish oson | Ichki 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.
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.
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.
// 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
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.
// 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.
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 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.
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.
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 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 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
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.