GraphQL — clientga kerakli fieldlarni aniq so‘rash imkonini beradigan API query tili va server execution modeli. U dastlab applicationlar uchun moslashuvchan data olish vositasi sifatida yaratilgan. GraphQL odatda bitta endpoint orqali query, mutation va subscription operationlarini bajaradi.
GraphQL database tili emas. Server schema va resolverlar orqali turli database, service va boshqa manbalardan data yig‘adi.
Schema
GraphQL API type system asosida tasvirlanadi.
Schema quyidagilarni belgilaydi:
Schema client va server o‘rtasidagi contract vazifasini bajaradi.
Object type
Object type fieldlardan tashkil topadi.
Masalan:
type User {
id: ID!
name: String!
posts: [Post!]!
}
! qiymat null bo‘lishi mumkin emasligini bildiradi.
List va element nullability alohida belgilanadi.
Query
Client kerakli fieldlarni tanlaydi:
query {
user(id: "15") {
id
name
}
}
Server faqat so‘ralgan shape’ga mos response yaratadi.
Mutation
Mutation data o‘zgartiradigan operation.
Masalan:
mutation {
createPost(input: {
title: "DOM"
}) {
id
title
}
}
Mutation ketma-ket bajarilish semantikasiga ega bo‘lishi mumkin.
Har field authorization va validationdan o‘tadi.
Subscription
Subscription serverdagi hodisalarni real vaqtga yaqin clientga uzatadi.
Transport WebSocket yoki boshqa protocol orqali ishlashi mumkin.
Misollar:
- yangi message;
- status o‘zgarishi;
- notification;
- live metric.
Connection lifecycle va permission boshqariladi.
Resolver
Har field qiymatini olish uchun resolver ishlaydi.
asosida natija qaytaradi.
Default resolver obyekt property’sini o‘qishi mumkin.
Arguments
Field argument qabul qilishi mumkin:
posts(limit: 10, status: PUBLISHED)
Argument schema bo‘yicha type validationdan o‘tadi.
Business validation resolver yoki service qatlamida bajariladi.
Variables
Dynamic qiymatlar query textga string concatenation bilan qo‘shilmaydi.
Variables alohida JSON sifatida yuboriladi.
Bu query reuse, cache va input handlingni yaxshilaydi.
Fragment
Fragment takroriy field to‘plamini qayta ishlatish imkonini beradi.
fragment UserCard on User {
id
name
}
Client katta queryni modul qismlarga ajratadi.
Fragment runtime authorizationni o‘zgartirmaydi.
Introspection
GraphQL schema o‘zi haqida query orqali ma’lumot bera oladi.
Toollar documentation, autocomplete va type generation uchun introspectiondan foydalanadi.
Productionda introspectionni o‘chirish securityning asosiy vositasi emas.
Authorization baribir har resolverda bajariladi.
Over-fetching va under-fetching
REST endpoint ba’zan clientga keragidan ortiq data beradi yoki bitta ekran uchun ko‘p endpoint talab qiladi.
GraphQL clientga bir operationda kerakli fieldlarni tanlash imkonini beradi.
Biroq juda katta nested query serverda qimmat execution yaratishi mumkin.
N+1 muammosi
Listdagi har item uchun resolver alohida database query yuborsa N+1 yuz beradi.
Masalan:
1 ta posts query
+ har post uchun author query
Batch loader va request-level cache ishlatiladi.
Query complexity
Attacker juda chuqur yoki ko‘p fieldli query yuborib resource sarfini oshirishi mumkin.
Himoya:
- depth limit;
- complexity score;
- field cost;
- timeout;
- pagination;
- rate limit;
- persisted query.
Faqat request soni bo‘yicha limit yetarli emas.
Authorization
Schema’da field mavjudligi userga access borligini anglatmaydi.
- object;
- field;
- action;
- tenant;
- relationship
bo‘yicha tekshiriladi.
Parent objectga ruxsat child sensitive fieldga avtomatik ruxsat bermasligi mumkin.
Error
GraphQL response HTTP 200 bo‘lsa ham errors maydoniga ega bo‘lishi mumkin.
Partial data va error birga qaytishi ehtimoli bor.
Client transport error, GraphQL error va business errorni ajratadi.
Pagination
Katta list cheksiz qaytarilmaydi.
Yondashuvlar:
Cursor pagination data o‘zgarayotgan muhitda barqarorroq bo‘lishi mumkin.
Caching
GraphQL ko‘pincha bitta POST endpointdan foydalangani sabab klassik HTTP cache kamroq ishlashi mumkin.
Client normalized cache, persisted GET query yoki CDN integration ishlatiladi.
Mutationdan keyin cache invalidation schema va entity IDga tayanadi.
Persisted query
Client to‘liq query text o‘rniga oldindan ro‘yxatdan o‘tgan hash yoki ID yuborishi mumkin. Server faqat tasdiqlangan operationni bajaradi. Bu payload hajmini kamaytiradi va public client uchun query allowlist yaratishi mumkin. Yangi application versioni kerakli querylarni oldindan publish qiladi.
Schema evolyutsiyasi
Fieldni birdan o‘chirish eski clientlarni buzadi. Avval field deprecated deb belgilanadi, usage kuzatiladi va clientlar migratsiya qilinadi. Yangi optional field qo‘shish odatda backward-compatible.
Federation
Katta tizimda bir nechta service o‘z schema qismini boshqarib, yagona graphga birlashtirilishi mumkin. Entity ownership, key va cross-service query performance aniq belgilanadi.
File upload
GraphQL specification file uploadni asosiy protocol sifatida belgilamaydi. Amaliy tizimlar multipart extension, signed URL yoki alohida upload service’dan foydalanadi. Katta binary’ni base64 qilib query ichiga qo‘shish payloadni oshiradi.
Operation name
Bir documentda bir nechta operation bo‘lsa client qaysi birini bajarishini operationName bilan ko‘rsatadi. Log va monitoringda bu nom foydali.
Aliases
Bir fieldni turli argument bilan bitta queryda olish uchun alias ishlatiladi. Response keylari alias nomi bilan qaytadi.
Bog‘liq tushunchalar
GraphQL, Schema, Query, Mutation, Subscription, Resolver, Fragment, Introspection, DataLoader, API, Type system