

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

# Menggunakan langganan untuk aplikasi data real-time di AWS AppSync
<a name="aws-appsync-real-time-data"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

AWS AppSyncmemungkinkan Anda memanfaatkan langganan untuk menerapkan pembaruan aplikasi langsung, pemberitahuan push, dll. Ketika klien menjalankan operasi langganan GraphQL, koneksi WebSocket aman secara otomatis dibuat dan dikelola oleh. AWS AppSync Aplikasi kemudian dapat mendistribusikan data secara real-time dari sumber data ke pelanggan sambil AWS AppSync terus mengelola koneksi aplikasi dan persyaratan penskalaan. Bagian berikut akan menunjukkan kepada Anda bagaimana langganan AWS AppSync bekerja.

## Arahan langganan skema GraphQL
<a name="graphql-schema-subscription-directives"></a>

Langganan di AWS AppSync dipanggil sebagai respons terhadap mutasi. Ini berarti Anda dapat membuat sumber data apa pun secara AWS AppSync real time dengan menentukan direktif skema GraphQL pada mutasi.

Pustaka AWS Amplify klien secara otomatis menangani manajemen koneksi berlangganan. Pustaka menggunakan pure WebSockets sebagai protokol jaringan antara klien dan layanan.

**catatan**  
Untuk mengontrol otorisasi pada waktu koneksi ke langganan, Anda dapat menggunakan AWS Identity and Access Management (IAM),, kumpulan identitas Amazon Cognito AWS Lambda, atau kumpulan pengguna Amazon Cognito untuk otorisasi tingkat lapangan. Untuk kontrol akses berbutir halus pada langganan, Anda dapat melampirkan resolver ke bidang langganan Anda dan melakukan logika menggunakan identitas pemanggil dan sumber data. AWS AppSync Untuk informasi selengkapnya, lihat [Mengkonfigurasi otorisasi dan otentikasi untuk mengamankan GraphQL Anda APIs](security-authz.md).

Langganan dipicu dari mutasi dan set pemilihan mutasi dikirim ke pelanggan.

Contoh berikut menunjukkan cara bekerja dengan langganan GraphQL. Itu tidak menentukan sumber data karena sumber data bisa Lambda, Amazon DynamoDB, atau Amazon Service. OpenSearch 

Untuk memulai langganan, Anda harus menambahkan titik masuk langganan ke skema Anda sebagai berikut:

```
schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}
```

Misalkan Anda memiliki situs posting blog, dan Anda ingin berlangganan blog baru dan perubahan ke blog yang ada. Untuk melakukan ini, tambahkan `Subscription` definisi berikut ke skema Anda:

```
type Subscription {
    addedPost: Post
    updatedPost: Post
    deletedPost: Post
}
```

Misalkan lebih lanjut bahwa Anda memiliki mutasi berikut:

```
type Mutation {
    addPost(id: ID! author: String! title: String content: String url: String): Post!
    updatePost(id: ID! author: String! title: String content: String url: String ups: Int! downs: Int! expectedVersion: Int!): Post!
    deletePost(id: ID!): Post!
}
```

Anda dapat membuat bidang ini secara real time dengan menambahkan `@aws_subscribe(mutations: ["mutation_field_1", "mutation_field_2"])` arahan untuk setiap langganan yang ingin Anda terima notifikasi, sebagai berikut:

```
type Subscription {
    addedPost: Post
    @aws_subscribe(mutations: ["addPost"])
    updatedPost: Post
    @aws_subscribe(mutations: ["updatePost"])
    deletedPost: Post
    @aws_subscribe(mutations: ["deletePost"])
}
```

Karena `@aws_subscribe(mutations: ["",..,""])` mengambil array input mutasi, Anda dapat menentukan beberapa mutasi, yang memulai langganan. Jika Anda berlangganan dari klien, kueri GraphQL Anda mungkin terlihat seperti berikut:

```
subscription NewPostSub {
    addedPost {
        __typename
        version
        title
        content
        author
        url
    }
}
```

Kueri berlangganan ini diperlukan untuk koneksi dan perkakas klien.

Dengan WebSockets klien murni, penyaringan set seleksi dilakukan per klien, karena setiap klien dapat menentukan set pilihannya sendiri. Dalam hal ini, set pemilihan langganan harus merupakan bagian dari set pemilihan mutasi. Misalnya, langganan yang `addedPost{author title}` ditautkan ke mutasi hanya `addPost(...){id author title url version}` menerima penulis dan judul posting. Itu tidak menerima bidang lainnya. Namun, jika mutasi tidak memiliki penulis dalam kumpulan pemilihannya, pelanggan akan mendapatkan `null` nilai untuk bidang penulis (atau kesalahan jika bidang penulis didefinisikan sebagai required/not-null dalam skema).

Set pemilihan langganan sangat penting saat menggunakan pure WebSockets. Jika bidang tidak didefinisikan secara eksplisit dalam langganan, maka bidang tersebut AWS AppSync tidak ditampilkan.

Pada contoh sebelumnya, langganan tidak memiliki argumen. Misalkan skema Anda terlihat seperti berikut:

```
type Subscription {
    updatedPost(id:ID! author:String): Post
    @aws_subscribe(mutations: ["updatePost"])
}
```

Dalam hal ini, klien Anda mendefinisikan langganan sebagai berikut:

```
subscription UpdatedPostSub {
    updatedPost(id:"XYZ", author:"ABC") {
        title
        content
    }
}
```

Jenis pengembalian `subscription` bidang dalam skema Anda harus cocok dengan tipe pengembalian bidang mutasi yang sesuai. Pada contoh sebelumnya, ini ditampilkan sebagai keduanya `addPost` dan `addedPost` dikembalikan sebagai tipe`Post`.

Untuk mengatur langganan pada klien, lihat[Membangun aplikasi klien menggunakan Amplify client](building-a-client-app.md).

## Menggunakan argumen berlangganan
<a name="using-subscription-arguments"></a>

Bagian penting dari penggunaan langganan GraphQL adalah memahami kapan dan bagaimana menggunakan argumen. Anda dapat membuat perubahan halus untuk memodifikasi bagaimana dan kapan memberi tahu klien tentang mutasi yang telah terjadi. Untuk melakukan ini, lihat skema sampel dari chapter quickstart, yang menciptakan “Todos”. Untuk skema sampel ini, mutasi berikut didefinisikan:

```
type Mutation {
    createTodo(input: CreateTodoInput!): Todo
    updateTodo(input: UpdateTodoInput!): Todo
    deleteTodo(input: DeleteTodoInput!): Todo
}
```

Dalam contoh default, klien dapat berlangganan pembaruan apa pun `Todo` `onUpdateTodo` `subscription` dengan menggunakan tanpa argumen:

```
subscription OnUpdateTodo {
  onUpdateTodo {
    description
    id
    name
    when
  }
}
```

Anda dapat memfilter Anda `subscription` dengan menggunakan argumennya. Misalnya, untuk hanya memicu `subscription` ketika a `todo` dengan spesifik `ID` diperbarui, tentukan `ID` nilainya:

```
subscription OnUpdateTodo {
  onUpdateTodo(id: "a-todo-id") {
    description
    id
    name
    when
  }
}
```

Anda juga dapat melewati beberapa argumen. Misalnya, berikut ini `subscription` menunjukkan cara mendapatkan pemberitahuan tentang `Todo` pembaruan apa pun di tempat dan waktu tertentu:

```
subscription todosAtHome {
  onUpdateTodo(when: "tomorrow", where: "at home") {
    description
    id
    name
    when
    where
  }
}
```

Perhatikan bahwa semua argumen bersifat opsional. Jika Anda tidak menentukan argumen apa pun di Anda`subscription`, Anda akan berlangganan semua `Todo` pembaruan yang terjadi di aplikasi Anda. Namun, Anda dapat memperbarui definisi bidang Anda `subscription` untuk meminta `ID` argumen. Ini akan memaksa respons spesifik, `todo` bukan semua `todo` s:

```
onUpdateTodo(
  id: ID!,
  name: String,
  when: String,
  where: String,
  description: String
): Todo
```

### Argumen nilai null memiliki arti
<a name="argument-null-value-has-meaning"></a>

Saat membuat kueri langganan AWS AppSync, nilai `null` argumen akan memfilter hasil secara berbeda dari menghilangkan argumen sepenuhnya.

Mari kita kembali ke contoh API todos di mana kita bisa membuat todos. Lihat skema sampel dari chapter quickstart.

Mari kita memodifikasi skema kita untuk menyertakan `owner` bidang baru, pada `Todo` tipe, yang menggambarkan siapa pemiliknya. `owner`Bidang tidak diperlukan dan hanya dapat diatur`UpdateTodoInput`. Lihat versi skema yang disederhanakan berikut ini:

```
type Todo {
  id: ID!
  name: String!
  when: String!
  where: String!
  description: String!
  owner: String
}

input CreateTodoInput {
  name: String!
  when: String!
  where: String!
  description: String!
}

input UpdateTodoInput {
  id: ID!
  name: String
  when: String
  where: String
  description: String
  owner: String
}

type Subscription {
    onUpdateTodo(
        id: ID,
        name: String,
        when: String,
        where: String,
        description: String
    ): Todo @aws_subscribe(mutations: ["updateTodo"])
}
```

Langganan berikut mengembalikan semua `Todo` pembaruan:

```
subscription MySubscription {
  onUpdateTodo {
    description
    id
    name
    when
    where
  }
}
```

Jika Anda memodifikasi langganan sebelumnya untuk menambahkan argumen bidang`owner: null`, Anda sekarang mengajukan pertanyaan yang berbeda. Langganan ini sekarang mendaftarkan klien untuk mendapatkan pemberitahuan tentang semua `Todo` pembaruan yang belum diberikan pemilik.

```
subscription MySubscription {
  onUpdateTodo(owner: null) {
    description
    id
    name
    when
    where
  }
}
```

**catatan**  
**Per 1 Januari 2022, MQTT over tidak lagi tersedia sebagai WebSockets protokol untuk langganan GraphQL di. AWS AppSync APIs Pure WebSockets adalah satu-satunya protokol yang didukung di AWS AppSync.**  
Klien berdasarkan AWS AppSync SDK atau pustaka Amplify, dirilis setelah November 2019, secara otomatis menggunakan WebSockets pure secara default. Upgrade klien ke versi terbaru memungkinkan mereka untuk menggunakan AWS AppSync WebSockets mesin murni.  
Pure WebSockets hadir dengan ukuran muatan yang lebih besar (240 KB), variasi opsi klien yang lebih luas, dan CloudWatch metrik yang ditingkatkan. Untuk informasi lebih lanjut tentang menggunakan WebSocket klien murni, lihat[Membangun WebSocket klien real-time di AWS AppSync](real-time-websocket-client.md).

# Membuat generik yang pub/sub APIs didukung oleh tanpa server WebSockets di AWS AppSync
<a name="aws-appsync-real-time-create-generic-api-serverless-websocket"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Beberapa aplikasi hanya memerlukan sederhana WebSocket APIs di mana klien mendengarkan saluran atau topik tertentu. Data JSON generik tanpa bentuk spesifik atau persyaratan yang diketik dengan kuat dapat didorong ke klien yang mendengarkan salah satu saluran ini dalam pola berlangganan publikasi (pub/sub) yang murni dan sederhana.

Gunakan AWS AppSync untuk mengimplementasikan sederhana pub/sub WebSocket APIs dengan sedikit atau tanpa pengetahuan GraphQL dalam hitungan menit dengan secara otomatis menghasilkan kode GraphQL di backend API dan sisi klien.

## Buat dan konfigurasikan pub-sub APIs
<a name="aws-appsync-real-time-enhanced-filtering-using-pub-sub-apis"></a>

Untuk memulai, lakukan hal berikut: 

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **Dashboard**, pilih **Create API**.

1. Pada layar berikutnya, pilih **Buat API real-time**, lalu pilih **Berikutnya**.

1. Masukkan nama yang ramah untuk pub/sub API Anda.

1. Anda dapat mengaktifkan fitur [API pribadi](https://docs.aws.amazon.com/appsync/latest/devguide/using-private-apis.html), tetapi kami sarankan untuk tetap menonaktifkannya untuk saat ini. Pilih **Berikutnya**.

1. Anda dapat memilih untuk secara otomatis membuat pub/sub API yang berfungsi menggunakan WebSockets. Kami merekomendasikan untuk menonaktifkan fitur ini untuk saat ini juga. Pilih **Berikutnya**.

1. Pilih **Buat API** dan kemudian tunggu beberapa menit. AWS AppSync Pub/sub API baru yang telah dikonfigurasi sebelumnya akan dibuat di akun Anda. AWS 

API menggunakan AWS AppSync resolver lokal bawaan (untuk informasi selengkapnya tentang penggunaan resolver lokal, lihat [Tutorial: Local Resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-local-resolvers-js.html) in the *AWS AppSync Developer Guide*) untuk mengelola beberapa pub/sub saluran dan WebSocket koneksi sementara, yang secara otomatis mengirimkan dan memfilter data ke klien berlangganan hanya berdasarkan nama saluran. Panggilan API diotorisasi dengan kunci API.

Setelah API diterapkan, Anda akan disajikan dengan beberapa langkah tambahan untuk menghasilkan kode klien dan mengintegrasikannya dengan aplikasi klien Anda. Sebagai contoh tentang cara mengintegrasikan klien dengan cepat, panduan ini akan menggunakan aplikasi web React sederhana.

1. Mulailah dengan membuat aplikasi React boilerplate menggunakan [NPM di mesin lokal](https://www.npmjs.com/get-npm) Anda:

   ```
   $ npx create-react-app mypubsub-app 
   $ cd mypubsub-app
   ```
**catatan**  
Contoh ini menggunakan [library Amplify](https://docs.amplify.aws/lib/) untuk menghubungkan klien ke API backend. Namun tidak perlu membuat proyek Amplify CLI secara lokal. Meskipun React adalah klien pilihan dalam contoh ini, pustaka Amplify juga mendukung klien iOS, Android, dan Flutter, memberikan kemampuan yang sama di runtime yang berbeda ini. [Klien Amplify yang didukung menyediakan abstraksi sederhana untuk berinteraksi dengan backend API AWS AppSync GraphQL dengan beberapa baris kode termasuk kemampuan bawaan yang sepenuhnya kompatibel dengan protokol real-time: WebSocket AWS AppSync WebSocket ](https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html)  

   ```
   $ npm install @aws-amplify/api
   ```

1. Di AWS AppSync konsol, pilih **JavaScript**, lalu **Unduh untuk mengunduh** satu file dengan detail konfigurasi API dan kode operasi GraphQL yang dihasilkan.

1. Salin file yang diunduh ke `/src` folder dalam proyek React Anda.

1. Selanjutnya, ganti konten `src/App.js` file boilerplate yang ada dengan kode klien sampel yang tersedia di konsol.

1. Gunakan perintah berikut untuk memulai aplikasi secara lokal:

   ```
   $ npm start
   ```

1. Untuk menguji pengiriman dan penerimaan data real-time, buka dua jendela browser dan akses*localhost:3000*. Aplikasi sampel dikonfigurasi untuk mengirim data JSON generik ke saluran hard-code bernama. *robots*

1.  **Di salah satu jendela browser, masukkan gumpalan JSON berikut di kotak teks lalu klik Kirim:** 

   ```
   {
     "robot":"r2d2",
     "planet": "tatooine"
   }
   ```

Kedua instance browser berlangganan *robots* saluran dan menerima data yang dipublikasikan secara real time, ditampilkan di bagian bawah aplikasi web:

![\[Contoh aplikasi React untuk pub/sub API\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/pub-sub-react.png)


Semua kode API GraphQL yang diperlukan, termasuk skema, resolver, dan operasi dibuat secara otomatis untuk mengaktifkan kasus penggunaan umum. pub/sub Di backend, data dipublikasikan ke AWS AppSync titik akhir real-time dengan mutasi GraphQL seperti berikut ini:

```
mutation PublishData {
    publish(data: "{\"msg\": \"hello world!\"}", name: "channel") {
        data
        name
    }
}
```

Pelanggan mengakses data yang dipublikasikan yang dikirim ke saluran sementara tertentu dengan langganan GraphQL terkait:

```
subscription SubscribeToData {
    subscribe(name:"channel") {
        name
        data
    }
}
```

## Menerapkan pub-sub APIs ke dalam aplikasi yang ada
<a name="aws-appsync-real-time-enhanced-filtering-existing-apps"></a>

Jika Anda hanya perlu mengimplementasikan fitur real-time dalam aplikasi yang ada, konfigurasi pub/sub API generik ini dapat dengan mudah diintegrasikan ke dalam aplikasi atau teknologi API apa pun. Meskipun ada keuntungan dalam menggunakan titik akhir API tunggal untuk mengakses, memanipulasi, dan menggabungkan data dengan aman dari satu atau lebih sumber data dalam satu panggilan jaringan dengan GraphQL, tidak perlu mengonversi atau membangun kembali aplikasi berbasis REST yang ada dari awal untuk memanfaatkan kemampuan real-time. AWS AppSync Misalnya, Anda dapat memiliki beban kerja CRUD yang ada di titik akhir API terpisah dengan klien mengirim dan menerima pesan atau peristiwa dari aplikasi yang ada ke pub/sub API generik hanya untuk waktu nyata dan tujuan. pub/sub 

# Mendefinisikan filter langganan yang disempurnakan di AWS AppSync
<a name="aws-appsync-real-time-enhanced-filtering"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Di AWS AppSync, Anda dapat menentukan dan mengaktifkan logika bisnis untuk pemfilteran data di backend secara langsung di resolver langganan GraphQL API dengan menggunakan filter yang mendukung operator logis tambahan. Anda dapat mengonfigurasi filter ini, tidak seperti argumen langganan yang ditentukan pada kueri langganan di klien. Untuk informasi selengkapnya tentang penggunaan argumen langganan, lihat[Menggunakan argumen berlangganan](aws-appsync-real-time-data.md#using-subscription-arguments). Untuk daftar operator, lihat[AWS AppSync referensi utilitas template pemetaan resolver](resolver-util-reference.md).

Untuk tujuan dokumen ini, kami membagi pemfilteran data real-time ke dalam kategori berikut:
+ **Pemfilteran dasar** - Pemfilteran berdasarkan argumen yang ditentukan klien dalam kueri langganan.
+ **Penyaringan yang disempurnakan** - Pemfilteran berdasarkan logika yang didefinisikan secara terpusat di backend layanan. AWS AppSync 

Bagian berikut menjelaskan cara mengonfigurasi filter langganan yang disempurnakan dan menunjukkan penggunaan praktisnya.

## Mendefinisikan langganan dalam skema GraphQL Anda
<a name="aws-appsync-real-time-enhanced-filtering-using-subscription-filters"></a>

Untuk menggunakan filter langganan yang disempurnakan, Anda menentukan langganan dalam skema GraphQL lalu tentukan filter yang disempurnakan menggunakan ekstensi pemfilteran. Untuk mengilustrasikan cara kerja penyaringan langganan yang disempurnakan AWS AppSync, gunakan skema GraphQL berikut, yang mendefinisikan API sistem manajemen tiket, sebagai contoh:

```
type Ticket {
	id: ID
	createdAt: AWSDateTime
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	status: String
	
}

type Mutation {
	createTicket(input: TicketInput): Ticket
}

type Query {
	getTicket(id: ID!): Ticket
}

type Subscription {
	onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"])
	onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"])
}



enum Priority {
	none
	lowest
	low
	medium
	high
	highest
}

input TicketInput {
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
```

Misalkan Anda membuat sumber `NONE` data untuk API Anda, lalu lampirkan resolver ke `createTicket` mutasi menggunakan sumber data ini. Penangan Anda mungkin terlihat seperti ini:

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
	return {
		payload: {
			id: util.autoId(),
			createdAt: util.time.nowISO8601(),
			status: 'pending',
			...ctx.args.input,
		},
	};
}

export function response(ctx) {
	return ctx.result;
}
```

**catatan**  
Filter yang disempurnakan diaktifkan di handler GraphQL resolver dalam langganan tertentu. Untuk informasi selengkapnya, lihat [Referensi Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

Untuk mengimplementasikan perilaku filter yang disempurnakan, Anda harus menggunakan `extensions.setSubscriptionFilter()` fungsi tersebut untuk menentukan ekspresi filter yang dievaluasi terhadap data yang dipublikasikan dari mutasi GraphQL yang mungkin diminati oleh klien berlangganan. Untuk informasi selengkapnya tentang ekstensi pemfilteran, lihat [Ekstensi](https://docs.aws.amazon.com//appsync/latest/devguide/extensions-js.html).

Bagian berikut menjelaskan cara menggunakan ekstensi penyaringan untuk mengimplementasikan filter yang disempurnakan.

## Membuat filter langganan yang disempurnakan menggunakan ekstensi penyaringan
<a name="aws-appsync-real-time-enhanced-filtering-defining-filters"></a>

Filter yang disempurnakan ditulis dalam JSON di handler respons dari resolver langganan. Filter dapat dikelompokkan bersama dalam daftar yang disebut a`filterGroup`. Filter didefinisikan menggunakan setidaknya satu aturan, masing-masing dengan bidang, operator, dan nilai. Mari kita tentukan resolver baru untuk `onSpecialTicketCreated` itu menyiapkan filter yang disempurnakan. Anda dapat mengonfigurasi beberapa aturan dalam filter yang dievaluasi menggunakan logika AND, sementara beberapa filter dalam grup filter dievaluasi menggunakan logika OR:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = {
		or: [
			{ severity: { ge: 7 }, priority: { in: ['high', 'medium'] } },
			{ category: { eq: 'security' }, group: { in: ['admin', 'operators'] } },
		],
	};
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

  // important: return null in the response
	return null;
}
```

Berdasarkan filter yang ditentukan dalam contoh sebelumnya, tiket penting secara otomatis didorong ke klien API berlangganan jika tiket dibuat dengan:
+ `priority`tingkat `high` atau `medium`

  DAN 
+ `severity`tingkat lebih besar dari atau sama dengan `7` (`ge`)

ATAU 
+ `classification`tiket diatur ke `Security` 

  DAN 
+ `group`penugasan diatur ke `admin` atau `operators`

![\[Contoh yang menunjukkan kueri pemfilteran tiket\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/aws-priority-example.png)


Filter yang didefinisikan dalam resolver langganan (penyaringan yang ditingkatkan) lebih diutamakan daripada pemfilteran hanya berdasarkan argumen langganan (pemfilteran dasar). Untuk informasi selengkapnya tentang penggunaan argumen langganan, lihat [Menggunakan argumen langganan](https://docs.aws.amazon.com//appsync/latest/devguide/aws-appsync-real-time-data.html#using-subscription-arguments)).

Jika argumen didefinisikan dan diperlukan dalam skema GraphQL langganan, pemfilteran berdasarkan argumen yang diberikan hanya terjadi jika argumen didefinisikan sebagai aturan dalam metode resolver. `extensions.setSubscriptionFilter()` Namun, jika tidak ada metode `extensions` penyaringan dalam resolver langganan, argumen yang didefinisikan dalam klien hanya digunakan untuk pemfilteran dasar. Anda tidak dapat menggunakan pemfilteran dasar dan penyaringan yang disempurnakan secara bersamaan.

Anda dapat menggunakan [`context`variabel](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) dalam logika ekstensi filter langganan untuk mengakses informasi kontekstual tentang permintaan. Misalnya, saat menggunakan Amazon Cognito User Pools, OIDC, atau otorisasi kustom Lambda untuk otorisasi, Anda dapat mengambil informasi tentang pengguna saat langganan dibuat. `context.identity` Anda dapat menggunakan informasi tersebut untuk membuat filter berdasarkan identitas pengguna Anda.

Sekarang asumsikan bahwa Anda ingin menerapkan perilaku filter yang disempurnakan untuk`onGroupTicketCreated`. `onGroupTicketCreated`Langganan membutuhkan `group` nama wajib sebagai argumen. Saat dibuat, tiket secara otomatis diberi `pending` status. Anda dapat mengatur filter langganan untuk hanya menerima tiket yang baru dibuat milik grup yang disediakan:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = { group: { eq: ctx.args.group }, status: { eq: 'pending' } };
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

	return null;
}
```

Ketika data dipublikasikan menggunakan mutasi seperti pada contoh berikut:

```
mutation CreateTicket {
  createTicket(input: {priority: medium, severity: 2, group: "aws"}) {
    id
    priority
    severity
    status
    group
    createdAt
  }
}
```

Klien berlangganan mendengarkan data yang akan didorong secara otomatis WebSockets segera setelah tiket dibuat dengan `createTicket` mutasi:

```
subscription OnGroup {
  onGroupTicketCreated(group: "aws") {
    category
    status
    severity
    priority
    id
    group
    createdAt
    content
  }
}
```

Klien dapat berlangganan tanpa argumen karena logika penyaringan diimplementasikan dalam AWS AppSync layanan dengan penyaringan yang ditingkatkan, yang menyederhanakan kode klien. Klien menerima data hanya jika kriteria filter yang ditentukan terpenuhi.

## Mendefinisikan filter yang disempurnakan untuk bidang skema bersarang
<a name="aws-appsync-real-time-enhanced-filters-nested-schema-fields.title"></a>

Anda dapat menggunakan pemfilteran langganan yang disempurnakan untuk memfilter bidang skema bersarang. Misalkan kita memodifikasi skema dari bagian sebelumnya untuk memasukkan jenis lokasi dan alamat:

```
type Ticket {
	id: ID
	createdAt: AWSDateTime
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	status: String
	location: ProblemLocation
}

type Mutation {
	createTicket(input: TicketInput): Ticket
}

type Query {
	getTicket(id: ID!): Ticket
}

type Subscription {
	onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"])
	onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"])
}

type ProblemLocation {
	address: Address
}

type Address {
	country: String
}

enum Priority {
	none
	lowest
	low
	medium
	high
	highest
}

input TicketInput {
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	location: AWSJSON
```

Dengan skema ini, Anda dapat menggunakan `.` pemisah untuk mewakili bersarang. Contoh berikut menambahkan aturan filter untuk bidang skema bersarang di bawah. `location.address.country` Langganan akan dipicu jika alamat tiket diatur ke`USA`:

```
import { util, extensions } from '@aws-appsync/utils';

export const request = (ctx) => ({ payload: null });

export function response(ctx) {
	const filter = {
		or: [
			{ severity: { ge: 7 }, priority: { in: ['high', 'medium'] } },
			{ category: { eq: 'security' }, group: { in: ['admin', 'operators'] } },
			{ 'location.address.country': { eq: 'USA' } },
		],
	};
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));
	return null;
}
```

Dalam contoh di atas, `location` mewakili tingkat bersarang satu, `address` mewakili tingkat bersarang dua, dan `country` mewakili tingkat bersarang tiga, yang semuanya dipisahkan oleh pemisah. `.`

Anda dapat menguji langganan ini dengan menggunakan `createTicket` mutasi:

```
mutation CreateTicketInUSA {
  createTicket(input: {location: "{\"address\":{\"country\":\"USA\"}}"}) {
    category
    content
    createdAt
    group
    id
    location {
      address {
        country
      }
    }
    priority
    severity
    status
  }
}
```

## Mendefinisikan filter yang disempurnakan dari klien
<a name="aws-appsync-real-time-enhanced-filtering-defining-from-client"></a>

[Anda dapat menggunakan pemfilteran dasar di GraphQL dengan argumen langganan.](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html#using-subscription-arguments) Klien yang membuat panggilan dalam kueri langganan mendefinisikan nilai argumen. Saat filter yang disempurnakan diaktifkan di resolver AWS AppSync langganan dengan `extensions` pemfilteran, filter backend yang ditentukan dalam resolver akan diutamakan dan diprioritaskan.

Konfigurasikan filter dinamis yang ditingkatkan yang ditentukan klien menggunakan `filter` argumen dalam langganan. Saat Anda mengonfigurasi filter ini, Anda harus memperbarui skema GraphQL untuk mencerminkan argumen baru:

```
...
type Subscription {
    onSpecialTicketCreated(filter: String): Ticket
        @aws_subscribe(mutations: ["createTicket"])
}
...
```

Klien kemudian dapat mengirim kueri langganan seperti pada contoh berikut:

```
subscription onSpecialTicketCreated($filter: String) {
     onSpecialTicketCreated(filter: $filter) {
        id
        group
        description
        priority
        severity
     }
 }
```

Anda dapat mengkonfigurasi variabel query seperti contoh berikut:

```
{"filter" : "{\"severity\":{\"le\":2}}"}
```

Utilitas `util.transform.toSubscriptionFilter()` resolver dapat diimplementasikan dalam template pemetaan respons langganan untuk menerapkan filter yang ditentukan dalam argumen langganan untuk setiap klien:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = ctx.args.filter;
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));
	return null;
}
```

Dengan strategi ini, klien dapat menentukan filter mereka sendiri yang menggunakan logika penyaringan yang disempurnakan dan operator tambahan. Filter ditetapkan ketika klien tertentu memanggil kueri langganan dalam WebSocket koneksi aman. Untuk informasi selengkapnya tentang utilitas transformasi untuk penyaringan yang disempurnakan, termasuk format payload variabel `filter` kueri, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html).

## Pembatasan penyaringan tambahan yang ditingkatkan
<a name="aws-appsync-real-time-enhanced-filtering-additional-restrictions"></a>

Di bawah ini adalah beberapa kasus penggunaan di mana pembatasan tambahan ditempatkan pada filter yang disempurnakan:
+ Filter yang disempurnakan tidak mendukung pemfilteran untuk daftar objek tingkat atas. Dalam kasus penggunaan ini, data yang dipublikasikan dari mutasi akan diabaikan untuk langganan yang ditingkatkan.
+ AWS AppSync mendukung hingga lima tingkat bersarang. Filter pada bidang skema melewati tingkat lima bersarang akan diabaikan. Ambil respons GraphQL di bawah ini. `continent`Bidang di `venue.address.country.metadata.continent` diperbolehkan karena itu adalah sarang tingkat lima. Namun, `financial` in `venue.address.country.metadata.capital.financial` adalah sarang level enam, jadi filter tidak akan berfungsi:

  ```
  {
      "data": {
          "onCreateFilterEvent": {
              "venue": {
                  "address": {
                      "country": {
                          "metadata": {
                              "capital": {
                                  "financial": "New York"
                              },
                              "continent" : "North America"
                          }
                      },
                      "state": "WA"
                  },
                  "builtYear": 2023
              },
              "private": false,
          }
      }
  }
  ```

# Berhenti berlangganan WebSocket koneksi menggunakan filter di AWS AppSync
<a name="aws-appsync-real-time-invalidation"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Di AWS AppSync, Anda dapat berhenti berlangganan secara paksa dan menutup (membatalkan) WebSocket koneksi dari klien yang terhubung berdasarkan logika penyaringan tertentu. Ini berguna dalam skenario terkait otorisasi seperti ketika Anda menghapus pengguna dari grup.

Pembatalan langganan terjadi sebagai respons terhadap muatan yang ditentukan dalam mutasi. Sebaiknya Anda memperlakukan mutasi yang digunakan untuk membatalkan koneksi langganan sebagai operasi administratif di API dan izin cakupan sesuai dengan membatasi penggunaannya pada pengguna admin, grup, atau layanan backend. Misalnya, menggunakan arahan otorisasi skema seperti atau. `@aws_auth(cognito_groups: ["Administrators"])` `@aws_iam` Untuk informasi selengkapnya, lihat [Menggunakan mode otorisasi tambahan](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#using-additional-authorization-modes).

Filter pembatalan menggunakan sintaks dan logika yang sama dengan filter langganan yang [disempurnakan](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html). Tentukan filter ini menggunakan utilitas berikut:
+ `extensions.invalidateSubscriptions()`— Didefinisikan dalam penangan respons GraphQL resolver untuk mutasi.
+ `extensions.setSubscriptionInvalidationFilter()`— Didefinisikan dalam penangan respons GraphQL resolver dari langganan yang ditautkan ke mutasi.

[Untuk informasi selengkapnya tentang ekstensi pemfilteran pembatalan, lihat JavaScript ikhtisar penyelesai.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

## Menggunakan pembatalan langganan
<a name="aws-appsync-real-time-invalidation-using-invalidations"></a>

Untuk melihat cara kerja pembatalan langganan AWS AppSync, gunakan skema GraphQL berikut:

```
type User {
  userId: ID!
  groupId: ID!
}
    
type Group {
  groupId: ID!
  name: String!
  members: [ID!]!
}

type GroupMessage {
  userId: ID!
  groupId: ID!
  message: String!
}

type Mutation {
    createGroupMessage(userId: ID!, groupId : ID!, message: String!): GroupMessage
    removeUserFromGroup(userId: ID!, groupId : ID!) : User @aws_iam
}

type Subscription {
    onGroupMessageCreated(userId: ID!, groupId : ID!): GroupMessage
        @aws_subscribe(mutations: ["createGroupMessage"])
}

type Query {
	none: String
}
```

Tentukan filter pembatalan dalam kode penyelesai `removeUserFromGroup` mutasi:

```
import { extensions } from '@aws-appsync/utils';

export function request(ctx) {
	return { payload: null };
}

export function response(ctx) {
	const { userId, groupId } = ctx.args;
	extensions.invalidateSubscriptions({
		subscriptionField: 'onGroupMessageCreated',
		payload: { userId, groupId },
	});
	return { userId, groupId };
}
```

Saat mutasi dipanggil, data yang ditentukan dalam `payload` objek digunakan untuk berhenti berlangganan langganan yang ditentukan. `subscriptionField` Filter pembatalan juga didefinisikan dalam template pemetaan respons `onGroupMessageCreated` langganan. 

Jika `extensions.invalidateSubscriptions()` payload berisi ID yang cocok dengan klien berlangganan seperti yang didefinisikan dalam filter, langganan terkait akan berhenti berlangganan. IDs Selain itu, WebSocket koneksi ditutup. Tentukan kode resolver langganan untuk langganan: `onGroupMessageCreated`

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = { groupId: { eq: ctx.args.groupId } };
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

	const invalidation = { groupId: { eq: ctx.args.groupId }, userId: { eq: ctx.args.userId } };
	extensions.setSubscriptionInvalidationFilter(util.transform.toSubscriptionFilter(invalidation));

	return null;
}
```

Perhatikan bahwa handler respons langganan dapat memiliki filter langganan dan filter pembatalan yang ditentukan secara bersamaan.

Misalnya, asumsikan bahwa klien A berlangganan pengguna baru dengan ID `user-1` ke grup dengan ID `group-1` menggunakan permintaan berlangganan berikut:

```
onGroupMessageCreated(userId : "user-1", groupId: :"group-1"){...}
```

AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan seperti yang didefinisikan dalam template pemetaan respons sebelumnya`onGroupMessageCreated`. Untuk klien A, filter langganan memungkinkan data dikirim hanya ke`group-1`, dan filter pembatalan ditentukan untuk keduanya `user-1` dan. `group-1`

Sekarang asumsikan bahwa klien B berlangganan pengguna dengan ID `user-2` ke grup dengan ID `group-2` menggunakan permintaan berlangganan berikut:

```
onGroupMessageCreated(userId : "user-2", groupId: :"group-2"){...}
```

AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan. Untuk klien B, filter langganan memungkinkan data dikirim hanya ke`group-2`, dan filter pembatalan ditentukan untuk keduanya `user-2` dan. `group-2`

Selanjutnya, asumsikan bahwa pesan grup baru dengan ID `message-1` dibuat menggunakan permintaan mutasi seperti pada contoh berikut:

```
createGroupMessage(id: "message-1", groupId :
      "group-1", message: "test message"){...}
```

Klien berlangganan yang cocok dengan filter yang ditentukan secara otomatis menerima muatan data berikut melalui: WebSockets

```
{
  "data": {
    "onGroupMessageCreated": {
      "id": "message-1",
      "groupId": "group-1",
      "message": "test message",
    }
  }
}
```

Klien A menerima pesan karena kriteria pemfilteran cocok dengan filter langganan yang ditentukan. Namun, klien B tidak menerima pesan, karena pengguna bukan bagian dari`group-1`. Selain itu, permintaan tidak cocok dengan filter langganan yang ditentukan dalam resolver langganan.

Akhirnya, asumsikan `user-1` bahwa dihapus dari `group-1` menggunakan permintaan mutasi berikut:

```
removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}
```

Mutasi memulai pembatalan langganan seperti yang didefinisikan dalam kode penangan respons `extensions.invalidateSubscriptions()` resolvernya. AWS AppSync kemudian berhenti berlangganan klien A dan menutup koneksinya. WebSocket Klien B tidak terpengaruh, karena payload pembatalan yang ditentukan dalam mutasi tidak cocok dengan pengguna atau grupnya.

Ketika AWS AppSync membatalkan koneksi, klien menerima pesan yang mengonfirmasi bahwa mereka berhenti berlangganan:

```
{
  "message": "Subscription complete."
}
```

## Menggunakan variabel konteks dalam filter pembatalan langganan
<a name="aws-appsync-real-time-invalidation-context"></a>

Seperti halnya filter langganan yang disempurnakan, Anda dapat menggunakan [`context`variabel](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) dalam ekstensi filter pembatalan langganan untuk mengakses data tertentu.

Misalnya, Anda dapat mengonfigurasi alamat email sebagai payload pembatalan dalam mutasi, lalu mencocokkannya dengan atribut email atau klaim dari pengguna berlangganan yang diotorisasi dengan kumpulan pengguna Amazon Cognito atau OpenID Connect. Filter pembatalan yang ditentukan dalam invalidator `extensions.setSubscriptionInvalidationFilter()` langganan memeriksa apakah alamat email yang ditetapkan oleh `extensions.invalidateSubscriptions()` muatan mutasi cocok dengan alamat email yang diambil dari token JWT pengguna, memulai pembatalan. `context.identity.claims.email`

# Membangun WebSocket klien real-time di AWS AppSync
<a name="real-time-websocket-client"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*..

AWS AppSync WebSocket klien real-time memungkinkan langganan GraphQL melalui proses multi-langkah. Klien pertama-tama membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time, mengirim pesan inisialisasi koneksi, dan menunggu pengakuan. Setelah koneksi berhasil, klien mendaftarkan langganan dengan mengirim pesan awal dengan kueri unik dan IDs GraphQL. AWS AppSync mengonfirmasi langganan yang berhasil dengan pesan pengakuan. Klien kemudian mendengarkan acara berlangganan, yang dipicu oleh mutasi yang sesuai. Untuk menjaga koneksi, AWS AppSync kirimkan pesan keep-alive secara berkala. Setelah selesai, klien membatalkan pendaftaran langganan dengan mengirim pesan berhenti. Sistem ini mendukung beberapa langganan pada satu WebSocket koneksi dan mengakomodasi berbagai mode otorisasi, termasuk kunci API, kumpulan pengguna Amazon Cognito, IAM, dan Lambda.

## Implementasi WebSocket klien real-time untuk langganan GraphQL
<a name="appsynclong-real-time-websocket-client-implementation-guide-for-graphql-subscriptions"></a>

Diagram urutan dan langkah-langkah berikut menunjukkan alur kerja langganan real-time antara WebSocket klien, klien HTTP, dan. AWS AppSync

![\[Sequence diagram showing WebSocket client, AppSync endpoints, and HTTP client interactions for real-time subscriptions.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/realtime-client-flow.png)


1. Klien membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. Jika ada kesalahan jaringan, klien harus melakukan backoff eksponensial yang gelisah. Untuk informasi lebih lanjut, lihat [Eksponensial backoff dan jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/) di Blog Arsitektur. AWS 

1. (Opsional) Setelah berhasil membangun WebSocket koneksi, klien mengirim `connection_init` pesan.

1. Jika `connection_init` dikirim, klien menunggu `connection_ack` pesan dari AWS AppSync. Pesan ini menyertakan `connectionTimeoutMs` parameter, yang merupakan waktu tunggu maksimum dalam milidetik untuk pesan `"ka"` (keep-alive).

1. AWS AppSync mengirim `"ka"` pesan secara berkala. Klien melacak waktu menerima setiap `"ka"` pesan. Jika klien tidak menerima `"ka"` pesan dalam `connectionTimeoutMs` milidetik, klien harus menutup koneksi.

1. Klien mendaftarkan langganan dengan mengirim pesan `start` berlangganan. WebSocket Koneksi tunggal mendukung beberapa langganan, bahkan jika mereka berada dalam mode otorisasi yang berbeda.

1. Klien menunggu untuk mengirim `start_ack` pesan AWS AppSync untuk mengkonfirmasi langganan yang berhasil. Jika ada kesalahan, AWS AppSync mengembalikan `"type": "error"` pesan.

1. Klien mendengarkan acara berlangganan, yang dikirim setelah mutasi yang sesuai dipanggil. Kueri dan mutasi biasanya dikirim melalui `https://` titik akhir AWS AppSync GraphQL. Langganan mengalir melalui titik akhir AWS AppSync real-time menggunakan secure WebSocket ()`wss://`.

1. Klien membatalkan pendaftaran langganan dengan mengirim pesan `stop` berlangganan.

1. Setelah membatalkan pendaftaran semua langganan dan memeriksa bahwa tidak ada pesan yang ditransfer melalui WebSocket, klien dapat memutuskan sambungan dari koneksi. WebSocket 

## Detail jabat tangan untuk membuat koneksi WebSocket
<a name="handshake-details-to-establish-the-websocket-connection"></a>

Untuk menghubungkan dan memulai jabat tangan yang sukses dengan AWS AppSync, WebSocket klien membutuhkan yang berikut:
+ Titik akhir AWS AppSync waktu-nyata
+ Header - Berisi informasi yang relevan dengan AWS AppSync titik akhir dan otorisasi. AWS AppSync mendukung tiga metode berikut untuk menyediakan header: 
  + Header melalui string kueri
    + Informasi header dikodekan sebagai string base64, berasal dari objek JSON yang dirangkai. Objek JSON ini berisi rincian yang relevan dengan AWS AppSync endpoint dan otorisasi. Isi objek JSON bervariasi tergantung pada mode otorisasi.
  + Header melalui `Sec-WebSocket-Protocol`
    + String berenkode Base64URL dari objek JSON yang dirangkai yang berisi informasi yang relevan dengan AWS AppSync titik akhir dan otorisasi diteruskan sebagai protokol di header. `Sec-WebSocket-Protocol` Isi objek JSON bervariasi tergantung pada mode otorisasi.
  + Header melalui header HTTP standar:
    + Header dapat diteruskan sebagai header HTTP standar dalam permintaan koneksi, mirip dengan bagaimana header diteruskan untuk kueri dan mutasi GraphQL. AWS AppSync Namun, meneruskan header melalui header HTTP standar tidak didukung untuk permintaan koneksi API pribadi.
+  `payload`— String yang dikodekan Base64 dari. `payload` Payload diperlukan hanya jika header disediakan menggunakan string kueri

Dengan persyaratan ini, WebSocket klien dapat terhubung ke URL, yang berisi titik akhir real-time dengan string kueri, menggunakan `graphql-ws` sebagai WebSocket protokol.

### Menemukan titik akhir real-time dari titik akhir GraphQL
<a name="discovering-the-appsync-real-time-endpoint-from-the-appsync-graphql-endpoint"></a>

Endpoint GraphQL dan endpoint real-time sedikit berbeda AWS AppSync dalam protokol dan domain. AWS AppSync Anda dapat mengambil titik akhir GraphQL menggunakan perintah (). AWS Command Line Interface AWS CLI`aws appsync get-graphql-api`

****AWS AppSync Titik akhir GraphQL:****  
 `https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql`

****AWS AppSync titik akhir waktu nyata:****  
 `wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql`

Aplikasi dapat terhubung ke titik akhir AWS AppSync GraphQL `https://` () menggunakan klien HTTP apa pun untuk kueri dan mutasi. Aplikasi dapat terhubung ke titik akhir AWS AppSync real-time (`wss://`) menggunakan WebSocket klien apa pun untuk berlangganan.

Dengan nama domain khusus, Anda dapat berinteraksi dengan kedua titik akhir menggunakan satu domain. Misalnya, jika Anda mengonfigurasi `api.example.com` sebagai domain kustom, Anda dapat berinteraksi dengan GraphQL dan titik akhir real-time menggunakan ini: URLs

**AWS AppSync titik akhir GraphQL domain kustom:**  
`https://api.example.com/graphql`

**AWS AppSync titik akhir real-time domain kustom:**  
`wss://api.example.com/graphql/realtime`

## Format parameter header berdasarkan mode otorisasi AWS AppSync API
<a name="header-parameter-format-based-on-appsync-api-authorization-mode"></a>

Format `header` objek yang digunakan dalam string kueri koneksi bervariasi tergantung pada mode otorisasi AWS AppSync API. `host`Bidang dalam objek mengacu pada titik akhir AWS AppSync GraphQL, yang digunakan untuk memvalidasi koneksi bahkan jika panggilan dilakukan `wss://` terhadap titik akhir real-time. Untuk memulai jabat tangan dan membuat koneksi resmi, `payload` harus menjadi objek JSON kosong. Payload diperlukan hanya jika header dilewatkan melalui string kueri.

Bagian berikut menunjukkan format header untuk setiap mode otorisasi.

### Kunci API
<a name="api-key"></a>

#### Header kunci API
<a name="api-key-list"></a>

**Isi header**
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.
+  `"x-api-key": <string>`: Kunci API dikonfigurasi untuk AWS AppSync API.

**Contoh**

```
{
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
    "x-api-key":"da2-12345678901234567890123456"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `x-api-key` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJob3N0IjoiZXhhbXBsZTEyMzQ1Njc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIngtYXBpLWtleSI6ImRhMi16NHc0NHZoczV6Z2MzZHRqNXNranJsbGxqaSJ9&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `x-api-key` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi kunci host dan API ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-api-key":"da2-12345678901234567890123456"
```

### Kumpulan pengguna Amazon Cognito dan OpenID Connect (OIDC)
<a name="amazon-cognito-user-pools-and-openid-connect-oidc"></a>

#### Header Amazon Cognito dan OIDC
<a name="amazon-cognito-user-pools-and-openid-connect-oidc-list"></a>

Isi header:
+  `"Authorization": <string>`: Token ID JWT. Header dapat menggunakan [skema Bearer](https://datatracker.ietf.org/doc/html/rfc6750#section-2.1).
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.

Contoh:

```
{
    "Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `Authorization` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `Authorization` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi host dan Otorisasi ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
```

### IAM
<a name="iam"></a>

#### Tajuk IAM
<a name="iam-list"></a>

**Konten header**
+  `"accept": "application/json, text/javascript"`: `<string>` Parameter konstan.
+  `"content-encoding": "amz-1.0"`: `<string>` Parameter konstan.
+  `"content-type": "application/json; charset=UTF-8"`: `<string>` Parameter konstan.
+  `"host": <string>`: Ini adalah host untuk titik akhir AWS AppSync GraphQL.
  + `"x-amz-date": <string>`: Stempel waktu harus dalam UTC dan dalam format ISO 8601 berikut: YYYYMMDD'T'HHMMSS'Z'. Misalnya, 20150830T123600Z adalah stempel waktu yang valid. Jangan sertakan milidetik dalam stempel waktu. Untuk informasi selengkapnya, lihat [Menangani tanggal di Tanda Tangan Versi 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html) di *Referensi Umum AWS*.
  +  `"X-Amz-Security-Token": <string>`: Token AWS sesi, yang diperlukan saat menggunakan kredensil keamanan sementara. Untuk informasi selengkapnya, lihat [Menggunakan kredensil sementara dengan AWS sumber daya](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_temp_use-resources.html) di Panduan Pengguna *IAM*.
  +  `"Authorization": <string>`: Tanda tangan Versi 4 (SiGv4) informasi penandatanganan untuk titik akhir. AWS AppSync Untuk informasi selengkapnya tentang proses penandatanganan, lihat [Tugas 4: Menambahkan tanda tangan ke permintaan HTTP](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html) di *Referensi Umum AWS*.

Permintaan HTTP penandatanganan SigV4 menyertakan URL kanonik, yang merupakan titik akhir AWS AppSync GraphQL dengan ditambahkan. `/connect` AWS Wilayah titik akhir layanan adalah Wilayah yang sama dengan tempat Anda menggunakan AWS AppSync API, dan nama layanannya adalah 'appsync'. Permintaan HTTP untuk menandatangani adalah sebagai berikut:

```
{
  url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql/connect",
  data: "{}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

**Contoh**

```
{
  "accept": "application/json, text/javascript",
  "content-encoding": "amz-1.0",
  "content-type": "application/json; charset=UTF-8",
  "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
  "x-amz-date": "20200401T001010Z",
  "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
  "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi titik akhir `host` (AWS AppSync GraphQL) dan header otorisasi lainnya diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan ke WebSocket URL sebagai parameter kueri bernama. `header` URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Objek JSON yang berisi header otorisasi `host` dan lainnya diubah menjadi string dan kemudian dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ew0KICAiYWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsDQogICJjb250ZW50LWVuY29kaW5nIjogImFtei0xLjAiLA0KICAiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiLA0KICAiaG9zdCI6ICJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsDQogICJ4LWFtei1kYXRlIjogIjIwMjAwNDAxVDAwMTAxMFoiLA0KICAiWC1BbXotU2VjdXJpdHktVG9rZW4iOiAiQWdFWEFNUExFWjJsdVgyVmpFQW9hRG1Gd0xYTnZkWFJvWldGRVhBTVBMRWN3UlFJZ0FoOTdDbGpxN3dPUEw4S3N4UDNZdER1eWMvOWhBajhQaEo3RnZmMzhTZ29DSVFEaEpFWEFNUExFUHNwaW9PenRqKytwRWFnV0N2ZVpVaktFbjB6eVVoQkVYQU1QTEVqai8vLy8vLy8vLy84QkVYQU1QTEV4T0RrMk5EZ3lOemcxTlNJTW8xbVducEVTV1VvWXc0QmtLcUVGU3JtM0RYdUw4dytaYlZjNEpLakRQNHZVQ0tOUjZMZTlDOXBacDlQc1cwTm9GeTN2TEJVZEFYRVhBTVBMRU9WRzhmZVhmaUVFQSsxa2hnRksvd0V0d1IrOXpGN05hTU1Nc2UwN3dOMmdHMnRIMGVLTUVYQU1QTEVRWCtzTWJ5dFFvOGllcFA5UFpPemxac1NGYi9kUDVROGhrNllFWEFNUExFWWNLWnNUa0RBcTJ1S0ZROG1ZVVZBOUV0UW5OUmlGTEVZODNhS3ZHL3RxTFdObkdsU05WeDdTTWNmb3ZrRkRxUWFtbSs4OHkxT3d3QUVZSzdxY29jZVg2WjdHR2NhWXVJZkdwYVgyTUNDRUxlUXZaKzhXeEVnT25JZno3R1l2c1lOakxaU2FSblY0RytJTFkxRjBRTlc2NFM5TnZqK0J3RGczaHQyQ3JOdnB3alZZbGo5VTNubXhFMFVHNW5lODNMTDVoaHFNcG0yNWttTDdlblZndzJrUXptVTJpZDRJS3UwQy9XYW9EUnVPMkY1ekU2M3ZKYnhOOEFZczczMzgrNEI0SEJiNkJaNk9VZ2c5NlExNVJBNDEvZ0lxeGFWUHh5VHBEZlRVNUdmU0x4b2NkWWVuaXFxcEZNdFpHMm45ZDB1N0dzUU5jRmtOY0czcURabTR0RG84dFpidXltMGEyVmNGMkU1aEZFZ1hCYStYTEpDZlhpLzc3T3FBRWpQMHg3UWRrM0I0M3A4S0cvQmFpb1A1UnNWOHpCR3ZIMXpBZ3lQaGEyck43MC90VDEzeXJtUGQ1UVlFZnd6ZXhqS3JWNG1XSXVSZzhOVEhZU1pKVWFleUN3VG9tODBWRlVKWEcrR1lUVXl2NVcyMmFCY25vUkdpQ2lLRVlUTE9rZ1hlY2RLRlRIbWNJQWVqUTlXZWxyMGExOTZLcTg3dzVLTk1Da2NDR0Zud0JORkxtZm5icE5xVDZyVUJ4eHMzWDVudFg5ZDhIVnRTWUlOVHNHWFhNWkNKN2ZuYldhamhnL2FveDBGdEhYMjFlRjZxSUdUOGoxeitsMm9wVStnZ3dVZ2toVVVnQ0gyVGZxQmorTUxNVlZ2cGdxSnNQS3Q1ODJjYUZLQXJJRkl2Tys5UXVweExuRUgyaHowNFRNVGZuVTZiUUM2ejFidVZlN2grdE9MbmgxWVBGc0xRODhhbmliLzdUVEM4azlEc0JUcTBBU2U4UjJHYlNFc21POXFiYk13Z0VhWVVoT0t0R2V5UXNTSmRoU2s2WHhYVGhyV0w5RW53QkNYRGtJQ01xZG50QXh5eU05bldzWjRiTDlKSHFFeGdXVW1mV0NoelBGQXFuM0Y0eTg5NlVxSFRaeGxxM1dHeXBuNUhIY2VtMkhxZjNJVnhLSDFpbmhxZFZ0a3J5RWlUV3JJN1pkamJxbnFSYmwrV2d0UHRLT093ZURsQ2FSczNSMnFYY2JOZ1ZobGVNazRJV25GOEQxNjk1QWVuVTFMd0hqT0pMa0NqeGdORmlXQUZFUEg5YUVYQU1QTEV4QT09IiwNCiAgIkF1dGhvcml6YXRpb24iOiAiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAyMDA0MDEvdXMtZWFzdC0xL2FwcHN5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZW50LWVuY29kaW5nO2NvbnRlbnQtdHlwZTtob3N0O3gtYW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04M0VYQU1QTEViY2MxZmUzZWU2OWY3NWNkNWViYmY0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1RVhBTVBMRWRjIg0KfQ"]
```

**Header melalui header HTTP standar**

Dalam metode ini, host dan informasi otorisasi lainnya ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-amz-date": "20200401T001010Z",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
```

Untuk menandatangani permintaan menggunakan domain kustom:

```
{
  url: "https://api.example.com/graphql/connect",
  data: "{}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

**Contoh**

```
{
  "accept": "application/json, text/javascript",
  "content-encoding": "amz-1.0",
  "content-type": "application/json; charset=UTF-8",
  "host": "api.example.com",
  "x-amz-date": "20200401T001010Z",
  "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
  "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
```

**Minta URL dengan string kueri**

```
wss://api.example.com/graphql?header=eyEXAMPLEHQiOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFEXAMPLEQiLCJjb250ZW50LWVuY29kaW5nIjoEXAMPLEEuMCIsImNvbnRlbnQtdHlwZSI6ImFwcGxpY2F0aW9EXAMPLE47IGNoYXJzZXQ9VVRGLTgiLCJob3N0IjoiZXhhbXBsZEXAMPLENjc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYEXAMPLEcy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIlgtEXAMPLElY3VyaXR5LVRva2VuIjoiQWdvSmIzSnBaMmx1WDJWakVBb2FEbUZ3TFhOdmRYUm9aV0Z6ZEMweUlrY3dSUUlnQWg5N0NsanE3d09QTDhLc3hQM1l0RHV5Yy85aEFqOFBoSjdGdmYzOFNnb0NJUURoSllKYkpsbmpQc3Bpb096dGorK3BFYWdXQ3ZlWlVqS0VuMHp5VWhCbXhpck5CUWpqLy8vLy8vLy8vLzhCRUFBYUREY3hPRGsyTkRneU56ZzFOU0lNbzFtV25wRVNXVW9ZdzRCa0txRUZTcm0zRFh1TDh3K1piVmM0SktqRFA0dlVDS05SNkxlOUM5cFpwOVBzVzBOb0Z5M3ZMQlVkQVh3dDZQSld1T1ZHOGZlWGZpRUVBKzFraGdGSy93RXR3Uis5ekY3TmFNTU1zZTA3d04yZ0cydEgwZUtNVFhuOEF3QVFYK3NNYnl0UW84aWVwUDlQWk96bFpzU0ZiL2RQNVE4aGs2WWpHVGFMMWVZY0tac1RrREFxMnVLRlE4bVlVVkE5RXRRbk5SaUZMRVk4M2FLdkcvdHFMV05uR2xTTlZ4N1NNY2ZvdmtGRHFRYW1tKzg4eTFPd3dBRVlLN3Fjb2NlWDZaN0dHY2FZdUlmR3BhWDJNQ0NFTGVRdlorOFd4RWdPbklmejdHWXZzWU5qTFpTYVJuVjRHK0lMWTFGMFFOVzY0UzlOdmorQndEZzNodDJDck52cHdqVllsajlVM25teEUwVUc1bmU4M0xMNWhocU1wbTI1a21MN2VuVmd3MmtRem1VMmlkNElLdTBDL1dhb0RSdU8yRjV6RTYzdkpieE44QVlzNzMzOCs0QjRIQmI2Qlo2T1VnZzk2UTE1UkE0MS9nSXF4YVZQeHlUcERmVFU1R2ZTTHhvY2RZZW5pcXFwRk10WkcybjlkMHU3R3NRTmNGa05jRzNxRFptNHREbzh0WmJ1eW0wYTJWY0YyRTVoRkVnWEJhK1hMSkNmWGkvNzdPcUFFalAweDdRZGszQjQzcDhLRy9CYWlvUDVSc1Y4ekJHdkgxekFneVBoYTJyTjcwL3RUMTN5cm1QZDVRWUVmd3pleGpLclY0bVdJdVJnOE5USFlTWkpVYWV5Q3dUb204MFZGVUpYRytHWVRVeXY1VzIyYUJjbm9SR2lDaUtFWVRMT2tnWGVjZEtGVEhtY0lBZWpROVdlbHIwYTE5NktxODd3NUtOTUNrY0NHRm53Qk5GTG1mbmJwTnFUNnJVQnh4czNYNW50WDlkOEhWdFNZSU5Uc0dYWE1aQ0o3Zm5iV2FqaGcvYW94MEZ0SFgyMWVGNnFJR1Q4ajF6K2wyb3BVK2dnd1Vna2hVVWdDSDJUZnFCaitNTE1WVnZwZ3FKc1BLdDU4MmNhRktBcklGSXZPKzlRdXB4TG5FSDJoejA0VE1UZm5VNmJRQzZ6MWJ1VmU3aCt0T0xuaDFZUEZzTFE4OGFuaWIvN1RUQzhrOURzQlRxMEFTZThSMkdiU0VzbU85cWJiTXdnRWFZVWhPS3RHZXlRc1NKZGhTazZYeFhUaHJXTDlFbndCQ1hEa0lDTXFkbnRBeHl5TTluV3NaNGJMOUpIcUV4Z1dVbWZXQ2h6UEZBcW4zRjR5ODk2VXFIVFp4bHEzV0d5cG41SEhjZW0ySHFmM0lWeEtIMWluaHFkVnRrcnlFaVRXckk3WmRqYnFucVJibCtXZ3RQdEtPT3dlRGxDYVJzM1IycVhjYk5nVmhsZU1rNElXbkY4RDE2OTVBZW5VMUx3SGpPSkxrQ2p4Z05GaVdBRkVQSDlhTklhcXMvWnhBPT0iLCJBdXRob3JpemF0aW9uIjoiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAxOTEwMDIvdXMtZWFzdC0xEXAMPLE5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZWEXAMPLE29kaW5nO2NvbnRlbnQtdHlwZTtob3EXAMPLEW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04MzE4EXAMPLEiY2MxZmUzZWU2OWY3NWNkEXAMPLE0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1ZDAzNDEXAMPLEn0=&payload=e30=
```

**catatan**  
Satu WebSocket koneksi dapat memiliki beberapa langganan (bahkan dengan mode otentikasi yang berbeda). Salah satu cara untuk menerapkan ini adalah dengan membuat WebSocket koneksi untuk langganan pertama dan kemudian menutupnya ketika langganan terakhir tidak terdaftar. Anda dapat mengoptimalkan ini dengan menunggu beberapa detik sebelum menutup WebSocket koneksi, jika aplikasi berlangganan segera setelah langganan terakhir tidak terdaftar. Untuk contoh aplikasi seluler, saat mengubah dari satu layar ke layar lainnya, saat *melepas pemasangan*, ia menghentikan langganan, dan pada acara *pemasangan*, ia memulai langganan yang berbeda.

### Otorisasi Lambda
<a name="lambda-auth"></a>

#### Header otorisasi Lambda
<a name="lambda-auth-list"></a>

**Konten header**
+  `"Authorization": <string>`: Nilai yang dilewatkan sebagai`authorizationToken`.
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.

**Contoh**

```
{
    "Authorization":"M0UzQzM1MkQtMkI0Ni00OTZCLUI1NkQtMUM0MTQ0QjVBRTczCkI1REEzRTIxLTk5NzItNDJENi1BQjMwLTFCNjRFNzQ2NzlCNQo=",
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `Authorization` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `Authorization` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi host dan Otorisasi ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
```

## WebSocket Operasi waktu nyata
<a name="real-time-websocket-operation"></a>

Setelah memulai WebSocket jabat tangan yang sukses dengan AWS AppSync, klien harus mengirim pesan berikutnya untuk terhubung ke AWS AppSync operasi yang berbeda. Pesan-pesan ini memerlukan data berikut:
+  `type`: Jenis operasi.
+  `id`: Pengenal unik untuk langganan. Kami merekomendasikan menggunakan UUID untuk tujuan ini.
+  `payload`: Muatan terkait, tergantung pada jenis operasi.

`type`Bidang adalah satu-satunya bidang yang diperlukan; `id` dan `payload` bidang adalah opsional.

### Urutan peristiwa
<a name="sequence-of-events"></a>

Agar berhasil memulai, membuat, mendaftar, dan memproses permintaan berlangganan, klien harus melangkah melalui urutan berikut:

1. Inisialisasi koneksi () `connection_init`

1. Pengakuan koneksi () `connection_ack`

1. Pendaftaran berlangganan (`start`)

1. Pengakuan berlangganan () `start_ack`

1. Memproses berlangganan (`data`)

1. Unregistrasi langganan () `stop`

## Koneksi pesan init
<a name="connection-init-message"></a>

(Opsional) Setelah jabat tangan berhasil, klien dapat mengirim `connection_init` pesan untuk mulai berkomunikasi dengan titik akhir AWS AppSync real-time. Pesannya adalah string yang diperoleh dengan merangkai objek JSON sebagai berikut:

```
{ "type": "connection_init" }
```

## Koneksi mengakui pesan
<a name="connection-acknowledge-message"></a>

Setelah mengirim `connection_init` pesan, klien harus menunggu `connection_ack` pesan. Semua pesan yang dikirim sebelum menerima `connection_ack` diabaikan. Pesan harus berbunyi sebagai berikut:

```
{
  "type": "connection_ack",
  "payload": {
    // Time in milliseconds waiting for ka message before the client should terminate the WebSocket connection
    "connectionTimeoutMs": 300000
  }
}
```

## Pesan keep-alive
<a name="keep-alive-message"></a>

Selain pesan pengakuan koneksi, klien secara berkala menerima pesan keep-alive. Jika klien tidak menerima pesan keep-alive dalam periode batas waktu koneksi, klien harus menutup koneksi. AWS AppSync terus mengirim pesan-pesan ini dan melayani langganan terdaftar sampai mematikan koneksi secara otomatis (setelah 24 jam). Pesan yang tetap hidup adalah detak jantung dan tidak perlu klien untuk mengakuinya.

```
{ "type": "ka" }
```

## Pesan pendaftaran berlangganan
<a name="subscription-registration-message"></a>

Setelah klien menerima `connection_ack` pesan, klien dapat mengirim pesan pendaftaran langganan ke AWS AppSync. Jenis pesan ini adalah objek JSON stringified yang berisi bidang-bidang berikut:
+  `"id": <string>`: ID langganan. ID ini harus unik untuk setiap langganan, jika tidak server mengembalikan kesalahan yang menunjukkan bahwa ID langganan diduplikasi.
+  `"type": "start"`: `<string>` Parameter konstan.
+  `"payload": <Object>`: Objek yang berisi informasi yang relevan dengan langganan.
  +  `"data": <string>`: Sebuah objek JSON stringified yang berisi query GraphQL dan variabel.
    +  `"query": <string>`: Operasi GraphQL.
    +  `"variables": <Object>`: Sebuah objek yang berisi variabel untuk query.
  +  `"extensions": <Object>`: Objek yang berisi objek otorisasi.
+  `"authorization": <Object>`: Objek yang berisi bidang yang diperlukan untuk otorisasi.

### Objek otorisasi untuk pendaftaran berlangganan
<a name="authorization-object-for-subscription-registration"></a>

Aturan yang sama di [Format parameter header berdasarkan mode otorisasi AWS AppSync API](#header-parameter-format-based-on-appsync-api-authorization-mode) bagian ini berlaku untuk objek otorisasi. Satu-satunya pengecualian adalah untuk IAM, di mana informasi tanda tangan SiGv4 sedikit berbeda. Untuk lebih jelasnya, lihat contoh IAM.

Contoh menggunakan kumpulan pengguna Amazon Cognito:

```
{
  "id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
      "extensions": {
        "authorization": {
          "Authorization": "eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJEXAMPLEBieU5WNHhsQjhPVW9YMnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyJzdWIiOiJhNmNmMjcwNy0xNjgxLTQ1NDItEXAMPLENjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImU3YWVmMzEyLWUEXAMPLEY0Zi04YjlhLTRjMWY5M2Q5ZTQ2OCIsInRva2VuX3VzZSI6ImFjY2VzcyIsIEXAMPLEIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk2MTgzMzgsImlzcyI6Imh0dEXAMPLEXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zbEXAMPLEc3QtMl83OHY0SVZibVAiLCJleHAiOjE1NzAyNTQ3NTUsImlhdCI6MTU3MDI1MTE1NSwianRpIjoiMmIEXAMPLEktZTVkMi00ZDhkLWJiYjItNjA0YWI4MDEwOTg3IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1EXAMPLE0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3J6YWZlIn0.CT-qTCtrYeboUJ4luRSTPXaNewNeEXAMPLE14C6sfg05tO0fOMpiUwj9k19gtNCCMqoSsjtQoUweFnH4JYa5EXAMPLEVxOyQEQ4G7jQrt5Ks6STn53vuseR3zRW9snWgwz7t3ZmQU-RWvW7yQU3sNQRLEXAMPLEcd0yufBiCYs3dfQxTTdvR1B6Wz6CD78lfNeKqfzzUn2beMoup2h6EXAMPLE4ow8cUPUPvG0DzRtHNMbWskjPanu7OuoZ8iFO_Eot9kTtAlVKYoNbWkZhkD8dxutyoU4RSH5JoLAnrGF5c8iKgv0B2dfEXAMPLEIihxaZVJ9w9w48S4EXAMPLEcA",
          "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com"
         }
      }
  },
  "type": "start"
}
```

Contoh menggunakan IAM:

```
{
  "id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
    "extensions": {
      "authorization": {
        "accept": "application/json, text/javascript",
        "content-type": "application/json; charset=UTF-8",
        "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
        "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=b90131a61a7c4318e1c35ead5dbfdeb46339a7585bbdbeceeaff51f4022eb1fd",
        "content-encoding": "amz-1.0",
        "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
        "x-amz-date": "20200401T001010Z"
      }
    }
  },
  "type": "start"
}
```

Contoh menggunakan nama domain kustom:

```
{
  "id": "key-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
      "extensions": {
        "authorization": {
          "x-api-key": "da2-12345678901234567890123456",
          "host": "api.example.com"
         }
      }
  },
  "type": "start"
}
```

Tanda tangan SigV4 tidak perlu ditambahkan `/connect` ke URL, dan operasi GraphQL stringified JSON menggantikan. `data` Berikut ini adalah contoh permintaan tanda tangan SiGv4:

```
{
  url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql",
  data: "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

## Pesan pengakuan berlangganan
<a name="subscription-acknowledge-message"></a>

Setelah mengirim pesan mulai berlangganan, klien harus menunggu AWS AppSync untuk mengirim `start_ack` pesan. `start_ack`Pesan tersebut menunjukkan bahwa langganan berhasil.

Contoh pengakuan berlangganan:

```
{
  "type": "start_ack",
  "id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
```

## Pesan kesalahan
<a name="error-message"></a>

Jika koneksi init atau pendaftaran langganan gagal, atau jika langganan berakhir dari server, server mengirimkan pesan kesalahan ke klien. Jika kesalahan terjadi selama koneksi waktu init, koneksi akan ditutup oleh server.
+  `"type": "error"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID dari langganan terdaftar yang sesuai, jika relevan.
+  `"payload" <Object>`: Objek yang berisi informasi kesalahan yang sesuai.

Contoh:

```
{
  "type": "error",
  "payload": {
    "errors": [
      {
        "errorType": "LimitExceededError",
        "message": "Rate limit exceeded"
      }
    ]
  }
}
```

## Memproses pesan data
<a name="processing-data-messages"></a>

Ketika klien mengirimkan mutasi, AWS AppSync mengidentifikasi semua pelanggan yang tertarik padanya dan mengirim `"type":"data"` pesan ke masing-masing menggunakan langganan yang sesuai `id` dari operasi berlangganan. `"start"` Klien diharapkan untuk melacak langganan `id` yang dikirimkannya sehingga ketika menerima pesan data, klien dapat mencocokkannya dengan langganan yang sesuai.
+  `"type": "data"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID dari langganan terdaftar yang sesuai.
+  `"payload" <Object>`: Objek yang berisi informasi berlangganan.

Contoh:

```
{
  "type": "data",
  "id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": {
      "onCreateMessage": {
        "__typename": "Message",
        "message": "test"
      }
    }
  }
}
```

## Pesan pembatalan pendaftaran berlangganan
<a name="subscription-unregistration-message"></a>

Saat aplikasi ingin berhenti mendengarkan acara berlangganan, klien harus mengirim pesan dengan objek JSON yang dirangkai berikut:
+  `"type": "stop"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID langganan untuk membatalkan pendaftaran.

Contoh:

```
{
  "type":"stop",
  "id":"ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69"
}
```

AWS AppSync mengirimkan kembali pesan konfirmasi dengan objek JSON stringifikasi berikut:
+  `"type": "complete"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID langganan yang tidak terdaftar.

Setelah klien menerima pesan konfirmasi, ia tidak menerima pesan lagi untuk langganan khusus ini.

Contoh:

```
{
  "type":"complete",
  "id":"eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
```

## Memutuskan sambungan WebSocket
<a name="disconnecting-the-websocket"></a>

Sebelum memutuskan sambungan, untuk menghindari kehilangan data, klien harus memiliki logika yang diperlukan untuk memeriksa bahwa tidak ada operasi saat ini di tempat melalui WebSocket koneksi. Semua langganan harus tidak terdaftar sebelum memutuskan sambungan dari. WebSocket