Birinci dərsdə sadə sorğu göndərdik: «mənə istifadəçini və onun adını ver». Real tətbiqə isə daha çox şey lazımdır. İstifadəçi formaya id daxil edir — onu sorğuya necə yerləşdirmək olar? Eyni anda iki istifadəçini yükləmək lazımdır. On ekran eyni sahələri sorğulayır — onları on dəfə köçürmək lazımdırmı? Bütün bunlar üçün GraphQL sorğularında alətlər var: arqumentlər, dəyişənlər, alias-lar, fraqmentlər və direktivlər. Kafedəki sifariş blankını təsəvvür edin. Blankdakı yeməklər — sahələrdir, «soğansız» kimi qeydlər — arqumentlərdir, hər dəfə yenidən doldurduğunuz boş xanalar isə dəyişənlərdir. Alias eyni yeməyi «Leyla üçün» və «Murad üçün» yazaraq iki dəfə sifariş verməyə imkan verir, fraqment isə yenidən yazmağa ehtiyac olmayan «kombo dəstdir».

Sorğunun anatomiyası

GraphQL sorğusu xüsusi formatda yazılmış mətndir. Budur, GetUser adlı tam sorğu; hələlik hər təfərrüata varmayın, onları ardıcıl araşdıracağıq:

graphql
query GetUser($id: ID!) {
  user(id: $id) {
    name
    email
  }
}

O, nədən ibarətdir:

  1. Əməliyyat tipi — query, mutation və ya subscription. Burada bu, məlumatın oxunmasıdır.
  2. Əməliyyatın adı — GetUser. Onu siz özünüz seçirsiniz. Server adsız sorğunu da icra edər, amma adı olan sorğunu loglarda, sazlama alətlərində və xəta hesabatlarında tapmaq daha asandır.
  3. Dəyişənlərin təyini — ($id: ID!). Ayrıca gələcək dəyər üçün boş yer. Ətraflı məlumat aşağıdadır.
  4. Arqumentli sahə — user(id: $id): Query tipindəki user sahəsi və onun id arqumenti.
  5. Sahələr dəsti (selection set) — fiqurlu mötərizələrin { } içindəki hər şey: almaq istədiyiniz məlumatın siyahısı.
GraphQL sorğusunun anatomiyası: əməliyyat tipi, ad, dəyişənlər, arqumentli sahə və sahələr dəsti
GraphQL sorğusunun anatomiyası: əməliyyat tipi, ad, dəyişənlər, arqumentli sahə və sahələr dəsti

Sahələr dəstləri istədiyiniz qədər bir-birinin içinə yerləşə bilər — keçən dərsdəki qrafın kənarları kimi: user { posts { comments { text } } }. Qayda birdir: obyekt qaytaran sahənin (user, posts) mütləq öz { … } dəsti olmalıdır, skalyarın (name, email) isə olmamalıdır. Sahələr dəsti olmayan { user(id: "1") } sorğusu xətadır: server Field "user" of type "User" must have a selection of subfields cavabını verəcək. GraphQL-də «hər şeyi qaytar» yoxdur, lazım olanı həmişə özünüz sadalayırsınız.

Sorğunun nə adı, nə də dəyişənləri yoxdursa, query sözünü atmaq olar: { users { name } } — birinci dərsdə belə yazmışdıq.

Arqumentlər

Arqumentlər sahəyə parametr ötürür, tamamilə funksiya arqumentləri kimi. Onlar sahənin adından sonra dairəvi mötərizədə yazılır: user(id: "1"). Keçən dərsdəki sxemdə user-in bir məcburi id arqumenti, posts-un isə bir ixtiyari published arqumenti var. Gəlin iki kök sahəni birlikdə sorğulayaq:

graphql
{
  user(id: "1") {
    name
  }
  posts(published: true) {
    title
  }
}

Dəyərlər təxminən JSON-dakı kimi yazılır: sətirlər cüt dırnaqda, ədədlər, true, false və null olduğu kimi, siyahılar isə [1, 2, 3]. Amma iki fərq var: obyekt açarları dırnaqsız yazılır, enum dəyərləri isə ümumiyyətlə dırnaqsız (orderBy: OLDEST). Arqumentlər təkcə kök sahələrdə yox, iç-içə sahələrdə də olur.