Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Properti tambahan dari GraphQL
GraphQL terdiri dari beberapa prinsip desain untuk menjaga kesederhanaan dan ketahanan dalam skala.
Deklaratif
GraphQL bersifat deklaratif, yang berarti pengguna akan mendeskripsikan (membentuk) data dengan hanya mendeklarasikan bidang yang ingin mereka kueri. Respons hanya akan mengembalikan data untuk properti ini. Misalnya, berikut adalah operasi yang mengambil Book
objek dalam tabel DynamoDB dengan nilai 13 ISBN id
9780199536061
:
{ getBook(id: "
9780199536061
") { name year author } }
Respons akan mengembalikan bidang di payload (name
,year
, danauthor
) dan tidak ada yang lain:
{ "data": { "getBook": { "name": "Anna Karenina", "year": "1878", "author": "Leo Tolstoy", } } }
Karena prinsip desain ini, GraphQL menghilangkan masalah abadi dari over- dan under-fetching REST APIs yang berhubungan dengan sistem yang kompleks. Ini menghasilkan pengumpulan data yang lebih efisien dan peningkatan kinerja jaringan.
Hirarkis
GraphQL fleksibel karena data yang diminta dapat dibentuk oleh pengguna agar sesuai dengan kebutuhan aplikasi. Data yang diminta selalu mengikuti jenis dan sintaks properti yang ditentukan dalam API GraphQL Anda. Misalnya, cuplikan berikut menunjukkan getBook
operasi dengan lingkup bidang baru yang disebut quotes
yang mengembalikan semua string kutipan tersimpan dan halaman yang ditautkan ke Book
9780199536061
:
{ getBook(id: "
9780199536061
") { name year author quotes { description page } } }
Menjalankan query ini mengembalikan hasil sebagai berikut:
{ "data": { "getBook": { "name": "Anna Karenina", "year": "1878", "author": "Leo Tolstoy", "quotes": [ { "description": "The highest Petersburg society is essentially one: in it everyone knows everyone else, everyone even visits everyone else.", "page": 135 }, { "description": "Happy families are all alike; every unhappy family is unhappy in its own way.", "page": 1 }, { "description": "To Konstantin, the peasant was simply the chief partner in their common labor.", "page": 251 } ] } } }
Seperti yang Anda lihat, quotes
bidang yang ditautkan ke buku yang diminta dikembalikan sebagai array dalam format yang sama yang dijelaskan oleh kueri kami. Meskipun tidak ditampilkan di sini, GraphQL memiliki keuntungan tambahan karena tidak khusus tentang lokasi data yang diambilnya. Books
dan quotes
dapat disimpan secara terpisah, tetapi GraphQL akan tetap mengambil informasi selama asosiasi ada. Ini berarti kueri Anda dapat mengambil banyak data mandiri dalam satu permintaan.
Introspektif
GraphQL adalah mendokumentasikan diri, atau introspektif. Ini mendukung beberapa operasi bawaan yang memungkinkan pengguna untuk melihat jenis dan bidang yang mendasarinya dalam skema. Misalnya, berikut adalah Foo
tipe dengan description
bidang date
dan:
type Foo { date: String description: String }
Kita bisa menggunakan _type
operasi untuk menemukan metadata pengetikan di bawah skema:
{ __type(name: "Foo") { name # returns the name of the type fields { # returns all fields in the type name # returns the name of each field type { # returns all types for each field name # returns the scalar type } } } }
Ini akan mengembalikan respons:
{ "__type": { "name": "Foo", # The type name "fields": [ { "name": "date", # The date field "type": { "name": "String" } # The date's type }, { "name": "description", # The description field "type": { "name": "String" } # The description's type }, ] } }
Fitur ini dapat digunakan untuk mengetahui jenis dan bidang apa yang didukung skema GraphQL tertentu. GraphQL mendukung berbagai macam operasi introspektif ini. Untuk informasi lebih lanjut, lihat Introspeksi
Pengetikan yang kuat
GraphQL mendukung pengetikan yang kuat melalui jenis dan sistem bidangnya. Ketika Anda mendefinisikan sesuatu dalam skema Anda, itu harus memiliki tipe yang dapat divalidasi sebelum runtime. Itu juga harus mengikuti spesifikasi sintaks GraphQL. Konsep ini tidak berbeda dengan pemrograman dalam bahasa lain. Misalnya, inilah Foo
tipe dari sebelumnya:
type Foo { date: String description: String }
Kita bisa melihat bahwa Foo
adalah objek yang akan dibuat. Di dalam instanceFoo
, akan ada date
dan description
field, keduanya tipe String
primitif (skalar). Secara sintaksis, kita melihat bahwa Foo
dideklarasikan, dan bidangnya ada di dalam ruang lingkupnya. Kombinasi pemeriksaan tipe dan sintaks logis ini memastikan bahwa API GraphQL Anda ringkas dan terbukti dengan sendirinya. Spesifikasi pengetikan dan sintaks GraphQL dapat ditemukan di sini.