

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

# 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