Bosh sahifa Wiki GraphQL

GraphQL

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

Query data o‘qish operationi.

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.

Resolver:

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:

Faqat request soni bo‘yicha limit yetarli emas.

Authorization

Schema’da field mavjudligi userga access borligini anglatmaydi.

Authorization:

  • 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