Definisi Schema
Root Schema
schema { query: Query mutation: Mutation }
Object Type
type User { id: ID! name: String! email: String }
Query
Query Dasar
query { user(id: "1") { name email } }
Query Bernama dengan Alias
query GetUsers { admin: user(role: ADMIN) { name } guest: user(role: GUEST) { name } }
Mutation
Mutation Dasar
mutation { createUser(input: { name: "Alice" }) { id name } }
Tipe Input
input CreateUserInput { name: String! email: String }
Subscription
Subscription Dasar
subscription { messageAdded(channel: "general") { text sender { name } } }
Ringkasan
subscriptionData real-time via WebSocket
Server pushServer mengirim pembaruan ke client
Single fieldHanya satu root field per subscription
Tipe
Scalar Type
IntInteger 32-bit bertanda
FloatBilangan pecahan presisi ganda
StringUrutan karakter UTF-8
Booleantrue atau false
IDIdentifier unik (diserialisasi sebagai String)
Modifier Tipe
StringString nullable
String!String non-null
[String]List nullable berisi string nullable
[String!]!List non-null berisi string non-null
Enum & Union
enum Role { ADMIN USER GUEST } union SearchResult = User | Post interface Node { id: ID! }
Argumen & Variabel
Variabel
query GetUser($id: ID!) { user(id: $id) { name } } # Variables: { "id": "123" }
Nilai Default
query GetUsers($limit: Int = 10) { users(limit: $limit) { name } }
Fragment
Fragment Bernama
fragment UserFields on User { id name email }
Menggunakan Fragment
query { user(id: "1") { ...UserFields } admin: user(id: "2") { ...UserFields } }
Inline Fragment
query { search(text: "a") { ... on User { name } ... on Post { title } } }
Directive
Directive Bawaan
@include(if: Boolean!)Sertakan field hanya jika kondisi benar
@skip(if: Boolean!)Lewati field jika kondisi benar
@deprecated(reason: String)Tandai field sebagai deprecated
Contoh Penggunaan
query GetUser($withEmail: Boolean!) { user(id: "1") { name email @include(if: $withEmail) } }
Introspection
Introspection Tipe
query { __type(name: "User") { name fields { name type { name } } } }
Introspection Schema
query { __schema { types { name kind } queryType { name } } }
Field Introspection
__schemaQuery tipe dan directive dari schema
__type(name:)Query tipe tertentu berdasarkan nama
__typenameMengembalikan nama tipe dari objek mana pun
Pola Umum
Pagination (gaya Relay)
query { users(first: 10, after: "cursor") { edges { node { name } cursor } pageInfo { hasNextPage } } }
Penanganan Error
{ "data": { "user": null }, "errors": [{ "message": "Not found", "path": ["user"] }] }
Praktik Terbaik
Beri nama operasiSelalu beri nama query dan mutation
Gunakan variabelJangan interpolasi nilai langsung ke query
Minta field yang dibutuhkanHindari over-fetching dengan seleksi yang tepat
Gunakan fragmentBagikan kumpulan field antar query