Subprotokol WebSocket JSON yang didukung Azure Web PubSub
Subprotokola JSON WebSocket, json.webpubsub.azure.v1
, memungkinkan pertukaran pesan publikasi/berlangganan antara klien melalui layanan tanpa perjalanan pulang pergi ke server upstream. Koneksi WebSocket yang menggunakan json.webpubsub.azure.v1
subprotokola disebut klien WebSocket PubSub.
Gambaran Umum
Koneksi WebSocket sederhana memicu message
peristiwa saat mengirim pesan dan bergantung pada sisi server untuk memproses pesan dan melakukan operasi lain.
json.webpubsub.azure.v1
Dengan subprotokola, Anda dapat membuat klien WebSocket PubSub yang dapat:
- bergabung dengan grup menggunakan permintaan gabungan.
- menerbitkan pesan langsung ke grup menggunakan permintaan penerbitan.
- merutekan pesan ke penanganan aktivitas upstream yang berbeda menggunakan permintaan peristiwa.
Misalnya, Anda dapat membuat klien WebSocket PubSub dengan kode JavaScript berikut:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
Dokumen ini menjelaskan permintaan dan respons subprotokol json.webpubsub.azure.v1
. Bingkai data masuk dan keluar harus berisi payload JSON.
Izin
Klien WebSocket PubSub hanya dapat menerbitkan ke klien lain saat diotorisasi. Yang roles
ditetapkan ke klien menentukan izin yang diberikan kepada klien:
Peran | Izin |
---|---|
Tidak ditentukan | Klien dapat mengirim permintaan peristiwa. |
webpubsub.joinLeaveGroup |
Klien dapat bergabung/meninggalkan grup mana pun. |
webpubsub.sendToGroup |
Klien dapat menerbitkan pesan ke grup mana pun. |
webpubsub.joinLeaveGroup.<group> |
Klien dapat bergabung/meninggalkan grup <group> . |
webpubsub.sendToGroup.<group> |
Klien dapat menerbitkan pesan ke grup <group> . |
Server dapat secara dinamis memberikan atau mencabut izin klien melalui REST API atau SDK server.
Permintaan
Bergabung dengan grup
Format:
{
"type": "joinGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
adalah identitas dari setiap permintaan dan harus unik. Layanan mengirimkan pesan respons ack untuk memberi tahu hasil proses permintaan. Untuk detailnya, lihat Respons AckId dan Ack
Meninggalkan grup
Format:
{
"type": "leaveGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
adalah identitas dari setiap permintaan dan harus unik. Layanan mengirimkan pesan respons ack untuk memberi tahu hasil proses permintaan. Untuk detailnya, lihat Respons AckId dan Ack
Menerbitkan pesan
Format:
{
"type": "sendToGroup",
"group": "<group_name>",
"ackId" : 1,
"noEcho": true|false,
"dataType" : "json|text|binary",
"data": {}, // data can be string or valid json token depending on the dataType
}
ackId
adalah identitas dari setiap permintaan dan harus unik. Layanan mengirimkan pesan respons ack untuk memberi tahu hasil proses permintaan. Untuk detailnya, lihat Respons AckId dan AcknoEcho
bersifat opsional. Jika diatur ke true, pesan ini tidak digaungkan kembali ke koneksi yang sama. Jika tidak diatur, nilai default adalah palsu.dataType
dapat diatur kejson
,text
, ataubinary
:json
:data
dapat berupa jenis apa pun yang didukung JSON dan akan diterbitkan apa adanya; JikadataType
tidak ditentukan, defaultnya adalahjson
.text
:data
harus dalam format string, dan data string akan diterbitkan;binary
:data
harus dalam format base64, dan data biner akan diterbitkan;
Kasus 1: menerbitkan data teks:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "text",
"data": "text data",
"ackId": 1
}
- Klien subprotoklasi dalam
<group_name>
menerima:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "text",
"data" : "text data"
}
- Klien WebSocket sederhana dalam
<group_name>
menerima stringtext data
.
Kasus 2: menerbitkan data JSON:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "json",
"data": {
"hello": "world"
}
}
- Klien subprotoklasi dalam
<group_name>
menerima:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "json",
"data" : {
"hello": "world"
}
}
- Klien WebSocket sederhana dalam
<group_name>
menerima string{"hello": "world"}
berseri .
Kasus 3: menerbitkan data biner:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "binary",
"data": "<base64_binary>",
"ackId": 1
}
- Klien subprotoklasi dalam
<group_name>
menerima:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "binary",
"data" : "<base64_binary>",
}
- Klien WebSocket sederhana dalam
<group_name>
menerima data biner dalam bingkai biner.
Kirim peristiwa kustom
Format:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json|text|binary",
"data": {}, // data can be string or valid json token depending on the dataType
}
ackId
adalah identitas dari setiap permintaan dan harus unik. Layanan mengirimkan pesan respons ack untuk memberi tahu hasil proses permintaan. Untuk detailnya, lihat Respons AckId dan Ack
dataType
dapat berupa salah satu dari text
, binary
, atau json
:
json
: data dapat berupa jenis apa pun yang didukung json dan akan diterbitkan apa adanya; Defaultnya adalahjson
.text
: data dalam format string, dan data string akan diterbitkan;binary
: data dalam format base64, dan data biner akan diterbitkan;
Kasus 1: mengirim peristiwa dengan data teks:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "text",
"data": "text data",
}
Penanganan aktivitas upstram menerima data yang mirip dengan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: text/plain
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
text data
Content-Type
untuk permintaan HTTP CloudEvents adalah text/plain
kapan dataType
adalah text
.
Kasus 2: mengirim peristiwa dengan data JSON:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json",
"data": {
"hello": "world"
},
}
Penanganan aktivitas upstram menerima data yang mirip dengan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
{
"hello": "world"
}
Content-Type
untuk permintaan HTTP CloudEvents adalah application/json
kapan dataType
json
Kasus 3: mengirim peristiwa dengan data biner:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "binary",
"data": "base64_binary",
}
Penanganan aktivitas upstram menerima data yang mirip dengan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/octet-stream
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
binary
Content-Type
untuk permintaan HTTP CloudEvents adalah application/octet-stream
kapan dataType
adalah binary
. Bingkai WebSocket dapat berupa format text
untuk bingkai pesan teks atau biner yang disandikan UTF8 untuk bingkai pesan binary
.
Layanan Web PubSub menolak klien jika pesan tidak cocok dengan format yang dijelaskan.
Respons
Jenis pesan yang diterima oleh klien dapat berupa:
- ack - Respons terhadap permintaan yang berisi
ackId
. - message - Pesan dari grup atau server.
- system - Pesan dari layanan Web PubSub.
Respons ack
Ketika permintaan klien berisi ackId
, layanan akan mengembalikan respons ack untuk permintaan tersebut. Klien harus menangani mekanisme ack, dengan menunggu respons ack dengan async
await
operasi dan menggunakan operasi batas waktu ketika respons ack tidak diterima dalam periode tertentu.
Format:
{
"type": "ack",
"ackId": 1, // The ack id for the request to ack
"success": false, // true or false
"error": {
"name": "Forbidden|InternalServerError|Duplicate",
"message": "<error_detail>"
}
}
Implementasi klien HARUS selalu memeriksa apakah success
adalah true
atau false
pertama, maka hanya membaca kesalahan ketika success
adalah false
.
Respons pesan
Klien dapat menerima pesan yang diterbitkan dari grup yang telah bergabung dengan klien atau dari server, yang, beroperasi dalam peran manajemen server, mengirim pesan ke klien atau pengguna tertentu.
Saat pesan berasal dari grup
{ "type": "message", "from": "group", "group": "<group_name>", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType "fromUserId": "abc" }
Ketika pesan berasal dari server.
{ "type": "message", "from": "server", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType }
Kasus 1: Mengirim data Hello World
ke koneksi melalui REST API dengan Content-Type
=text/plain
Klien WebSocket sederhana menerima bingkai WebSocket teks dengan data:
Hello World
;Klien PubSub WebSocket menerima:
{ "type": "message", "from": "server", "dataType" : "text", "data": "Hello World", }
Kasus 2: Mengirim data { "Hello" : "World"}
ke koneksi melalui REST API dengan Content-Type
=application/json
Klien WebSocket sederhana menerima bingkai WebSocket teks dengan data ter string:
{ "Hello" : "World"}
.Klien PubSub WebSocket menerima:
{ "type": "message", "from": "server", "dataType" : "json", "data": { "Hello": "World" } }
Jika REST API mengirim string Hello World
menggunakan application/json
jenis konten, klien WebSocket sederhana menerima string JSON, yang dibungkus "Hello World"
dengan tanda kutip ganda ("
).
Kasus 3: Mengirim data biner ke koneksi melalui REST API dengan Content-Type
=application/octet-stream
Klien WebSocket sederhana menerima bingkai WebSocket biner dengan data biner.
Klien PubSub WebSocket menerima:
{ "type": "message", "from": "server", "dataType" : "binary", "data": "<base64_binary>" }
Respons sistem
Layanan Web PubSub mengirimkan pesan terkait sistem ke klien.
Tersambung
Pesan yang dikirim ke klien ketika klien berhasil terhubung:
{
"type": "system",
"event": "connected",
"userId": "user1",
"connectionId": "abcdefghijklmnop",
}
Terputus
Pesan yang dikirim ke klien ketika server menutup koneksi, atau ketika layanan menolak klien.
{
"type": "system",
"event": "disconnected",
"message": "reason"
}
Langkah berikutnya
Gunakan sumber daya ini untuk mulai membangun aplikasi Anda sendiri: