Variabel dinamis
Query GraphQL berikut menerima variabel $limit untuk mengetahui berapa banyak postingan yang akan diambil, dan tipe variabel, Int, harus dideklarasikan dalam operasi:
query GetPosts($limit: Int) {
posts(limit: $limit) {
id
title
}
}Ini adalah perilaku yang diharapkan dalam GraphQL, di mana kita menyediakan nilai variabel dalam kamus JSON yang didefinisikan dalam dokumen yang sama:
{
"limit": 3
}Ini adalah perilaku "statis", yang dimiliki oleh banyak bahasa pemrograman. Dalam PHP, misalnya, argumen fungsi dapat menunjukkan tipenya, seperti pada kode di bawah ini, di mana input $number didefinisikan sebagai integer:
function double(int $number): int
{
return $number * 2;
}Sekarang, ketika mendeklarasikan variabel di dalam tubuh fungsi PHP, kita tidak menunjukkan tipenya; tipe variabel ditentukan oleh konteks di mana variabel tersebut digunakan. Pada kode di bawah ini, menetapkan nilai integer ke $double akan membuat variabel ini menjadi integer:
function double(int $number): int
{
// This var is an integer, but we don't need to declare it
$double = $number * 2;
return $double;
}Berkat direktif kustom, server GraphQL dapat menyediakan perilaku serupa dan mendukung variabel dinamis, di mana variabel dinamis mendapatkan nilainya saat menyelesaikan query di server, bukan disediakan oleh klien.
Ekstensi Multiple Query Execution dari Gato GraphQL hadir dengan direktif kustom @export, yang memungkinkan ekspor nilai sebuah field ke dalam variabel (dinamis), dan kemudian kita dapat membaca nilai variabel ini dalam argumen field dari operasi yang berbeda:
query ExportLoggedInUserName {
me {
name @export(as: "userName")
}
}
query GetPostsContainingString
@depends(on: "ExportLoggedInUserName")
{
posts(filter: { search: $userName }) {
id
title
}
}Variabel $userName bersifat dinamis, dan tidak perlu mendefinisikan tipenya (String) dalam operasi yang menggunakannya (GetPostsContainingString). Server GraphQL sudah memahami konteksnya.
Jika kita mencoba menggunakan nilai variabel dengan tipe yang tidak cocok, seperti pada query berikut (di mana Int diharapkan tetapi variabel dinamis bertipe String):
query ExportDynamicVariable {
_echo(value: "Hello world!") @export(as: "stringVar") # Exported: String
}
query UseVariable
@depends(on: "ExportDynamicVariable")
{
posts(
pagination: {
limit: $stringVar # Expected: Int, received: String
}
) {
id
}
}...maka server GraphQL gagal melakukan coercing pada nilai, dan mengembalikan error:
{
"errors": [
{
"message": "Cannot cast value 'Hello world!' for type 'Int'",
"locations": [
{
"line": 10,
"column": 13
}
],
"extensions": {
"path": [
"{limit: $stringVar}",
"(pagination: {limit: $stringVar})",
"posts(pagination: {limit: $stringVar}) { ... }",
"query UseVariable @depends(on: \"ExportDynamicVariable\") { ... }"
],
"type": "QueryRoot",
"field": "posts(pagination: {limit: $stringVar}) { ... }",
"id": "root",
"code": "gql@5.6.1[16]",
"specifiedBy": "https:\/\/spec.graphql.org\/draft\/#sec-Values-of-Correct-Type"
}
}
]
}Spesifikasi GraphQL
Fungsionalitas ini saat ini bukan bagian dari spesifikasi GraphQL, tetapi telah diminta dalam: