

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Properti tambahan GraphQL
<a name="graphql-properties"></a>

GraphQL terdiri dari beberapa prinsip desain untuk menjaga kesederhanaan dan ketahanan dalam skala.

## Deklaratif
<a name="declarative-property"></a>

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 ISBN 13 dari: `id` *9780199536061*

```
{
  getBook(id: "9780199536061") {
    name
    year
    author
  }
}
```

Respons akan mengembalikan bidang di payload (`name`,`year`, dan`author`) dan tidak ada yang lain:

```
{
  "data": {
    "getBook": {
      "name": "Anna Karenina",
      "year": "1878",
      "author": "Leo Tolstoy",
    }
  }
}
```

Karena prinsip desain ini, GraphQL menghilangkan masalah abadi dari pengambilan berlebihan dan kekurangan yang ditangani REST dalam sistem yang APIs kompleks. Ini menghasilkan pengumpulan data yang lebih efisien dan peningkatan kinerja jaringan.

## Hirarkis
<a name="hierarchical-property"></a>

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 GraphQL API 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
<a name="introspective-property"></a>

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](https://graphql.org/learn/introspection/).

## Pengetikan yang kuat
<a name="strong-typing-property"></a>

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 instance`Foo`, 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 GraphQL API Anda ringkas dan terbukti dengan sendirinya. [Spesifikasi pengetikan dan sintaks GraphQL dapat ditemukan di sini.](https://spec.graphql.org/)