Az Azure Web PubSub által támogatott JSON WebSocket-alprotocol
A JSON WebSocket alprotocolja lehetővé teszi a közzétételi/előfizetési üzenetek cseréjét az ügyfelek között a szolgáltatáson keresztül anélkül, json.webpubsub.azure.v1
hogy a felsőbb rétegbeli kiszolgálóra utazik. Az alprojektet használó json.webpubsub.azure.v1
WebSocket-kapcsolatot PubSub WebSocket-ügyfélnek nevezzük.
Áttekintés
Egy egyszerű WebSocket-kapcsolat eseményt message
aktivál, amikor üzeneteket küld, és a kiszolgálóoldalra támaszkodik az üzenetek feldolgozásához és más műveletek végrehajtásához.
json.webpubsub.azure.v1
Az alprotocol segítségével létrehozhat PubSub WebSocket-ügyfeleket, amelyek a következőre képesek:
- csatlakozáskérések használatával csatlakozhat egy csoporthoz.
- üzeneteket tehet közzé közvetlenül egy csoportban közzétételi kérések használatával.
- üzenetek átirányítása különböző felsőbb rétegbeli eseménykezelőkhöz eseménykérelmek használatával.
Létrehozhat például egy PubSub WebSocket-ügyfelet a következő JavaScript-kóddal:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
Ez a dokumentum a részprotocol-kérelmeket json.webpubsub.azure.v1
és a válaszokat ismerteti. Mind a bejövő, mind a kimenő adatkeretnek JSON hasznos adatokat kell tartalmaznia.
Engedélyek
A PubSub WebSocket-ügyfél csak akkor tehet közzé más ügyfeleket, ha az engedélyezett. Az roles
ügyfélhez rendeltek határozzák meg az ügyfélnek adott engedélyeket:
Szerepkör | Engedély |
---|---|
Nincs megadva | Az ügyfél eseménykérelmeket küldhet. |
webpubsub.joinLeaveGroup |
Az ügyfél bármilyen csoporthoz csatlakozhat vagy kiléphet. |
webpubsub.sendToGroup |
Az ügyfél bármilyen csoportban közzétehet üzeneteket. |
webpubsub.joinLeaveGroup.<group> |
Az ügyfél csatlakozhat vagy kiléphet a csoportból <group> . |
webpubsub.sendToGroup.<group> |
Az ügyfél közzéteheti az üzeneteket a csoportban <group> . |
A kiszolgáló dinamikusan adhat meg vagy vonhat vissza ügyfélengedélyeket REST API-k vagy kiszolgálói SDK-k használatával.
maximális száma
Csoportok csatlakoztatása
Formátum:
{
"type": "joinGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
az egyes kérések identitása, és egyedinek kell lenniük. A szolgáltatás egy sikertelen válaszüzenetet küld, amely értesíti a kérés folyamateredményét. Részletekért lásd: AckId és Ack Response
Csoportok elhagyása
Formátum:
{
"type": "leaveGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
az egyes kérések identitása, és egyedinek kell lenniük. A szolgáltatás egy sikertelen válaszüzenetet küld, amely értesíti a kérés folyamateredményét. Részletekért lásd: AckId és Ack Response
Üzenetek közzététele
Formátum:
{
"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
az egyes kérések identitása, és egyedinek kell lenniük. A szolgáltatás egy sikertelen válaszüzenetet küld, amely értesíti a kérés folyamateredményét. Részletekért lásd: AckId és Ack Response- A(z)
noEcho
nem kötelező. Ha igaz értékre van állítva, ez az üzenet nem lesz ugyanahhoz a kapcsolathoz visszahangosulva. Ha nincs beállítva, az alapértelmezett érték hamis. dataType
a következőrejson
állítható be: ,text
vagybinary
:json
:data
bármilyen típusú lehet, amelyet a JSON támogat, és közzé lesz téve, mint amilyen; HadataType
nincs megadva, az alapértelmezés szerint a .json
text
:data
sztringformátumban kell lennie, és a sztringadatok közzé lesznek téve;binary
:data
alap64 formátumban kell lennie, és a bináris adatok közzé lesznek téve;
1. eset: szöveges adatok közzététele:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "text",
"data": "text data",
"ackId": 1
}
- A kapott alprotocol-ügyfelek
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "text",
"data" : "text data"
}
- Az egyszerű WebSocket-ügyfelek
<group_name>
megkapják a sztringettext data
.
2. eset: JSON-adatok közzététele:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "json",
"data": {
"hello": "world"
}
}
- A kapott alprotocol-ügyfelek
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "json",
"data" : {
"hello": "world"
}
}
- Az egyszerű WebSocket-ügyfelek
<group_name>
a szerializált sztringet{"hello": "world"}
kapják.
3. eset: bináris adatok közzététele:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "binary",
"data": "<base64_binary>",
"ackId": 1
}
- A kapott alprotocol-ügyfelek
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "binary",
"data" : "<base64_binary>",
}
- Az egyszerű WebSocket-ügyfelek
<group_name>
a bináris keretben kapják meg a bináris adatokat.
Egyéni események küldése
Formátum:
{
"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
az egyes kérések identitása, és egyedinek kell lenniük. A szolgáltatás egy sikertelen válaszüzenetet küld, amely értesíti a kérés folyamateredményét. Részletekért lásd: AckId és Ack Response
dataType
lehet az text
egyik, binary
vagy json
a következő:
json
: az adatok bármilyen típusú json-támogatottak lehetnek, és közzé lesznek téve, mint amilyenek; Az alapértelmezett érték a következőjson
: .text
: az adatok sztring formátumúak, és a sztringadatok közzé lesznek téve;binary
: az adatok base64 formátumban jelennek meg, és a bináris adatok közzé lesznek téve;
1. eset: esemény küldése szöveges adatokkal:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "text",
"data": "text data",
}
A felsőbb rétegbeli eseménykezelő a következőhöz hasonló adatokat fogad:
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
A Content-Type
CloudEvents HTTP-kérésének az az oka, text/plain
hogy mikor dataType
van text
.
2. eset: esemény küldése JSON-adatokkal:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json",
"data": {
"hello": "world"
},
}
A felsőbb rétegbeli eseménykezelő a következőhöz hasonló adatokat fogad:
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"
}
A Content-Type
CloudEvents HTTP-kérésének az az okaapplication/json
, hogy dataType
json
3. eset: esemény küldése bináris adatokkal:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "binary",
"data": "base64_binary",
}
A felsőbb rétegbeli eseménykezelő a következőhöz hasonló adatokat fogad:
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
A Content-Type
CloudEvents HTTP-kérésének az az oka, application/octet-stream
hogy mikor dataType
van binary
. A WebSocket-keret formátuma lehet text
szöveges üzenetkeretekhez vagy UTF8 kódolású bináris fájlokhoz az üzenetkeretekhez binary
.
A Web PubSub szolgáltatás elutasítja az ügyfelet, ha az üzenet nem felel meg a leírt formátumnak.
Válaszok
Az ügyfél által fogadott üzenettípusok a következőek lehetnek:
- ack - A válasz egy kérelmet tartalmazó
ackId
. - üzenet – A csoport vagy a kiszolgáló üzenetei.
- system – A Web PubSub szolgáltatás üzenetei.
Ack-válasz
Ha az ügyfélkérés tartalmaz ackId
, a szolgáltatás a kérésre adott válaszát adja vissza. Az ügyfélnek kezelnie kell az ack mechanizmust úgy, hogy egy async
await
művelettel megvárja az ack választ, és időtúllépési műveletet használ, ha az ack-válasz nem érkezik meg egy adott időszakban.
Formátum:
{
"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>"
}
}
Az ügyfél implementációjának mindig ellenőriznie kell, hogy az-e success
true
vagy false
az első, majd csak akkor olvassa el a hibát, ha success
van false
.
Üzenet válasza
Az ügyfelek fogadhatnak üzeneteket egy olyan csoportból, amelyhez az ügyfél csatlakozott, vagy a kiszolgálóról, amely kiszolgálófelügyeleti szerepkörben működik, üzeneteket küld adott ügyfeleknek vagy felhasználóknak.
Ha az üzenet egy csoportból származik
{ "type": "message", "from": "group", "group": "<group_name>", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType "fromUserId": "abc" }
Amikor az üzenet a kiszolgálóról származik.
{ "type": "message", "from": "server", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType }
1. eset: Adatok Hello World
küldése a kapcsolatra a REST API-val Content-Type
=text/plain
Egy egyszerű WebSocket-ügyfél szöveges WebSocket-keretet kap adatokkal:
Hello World
;A PubSub WebSocket-ügyfél a következőt kapja:
{ "type": "message", "from": "server", "dataType" : "text", "data": "Hello World", }
2. eset: Adatok { "Hello" : "World"}
küldése a kapcsolatra a REST API-val Content-Type
=application/json
Egy egyszerű WebSocket-ügyfél szöveges WebSocket-keretet kap sztringezett adatokkal:
{ "Hello" : "World"}
.A PubSub WebSocket-ügyfél a következőt kapja:
{ "type": "message", "from": "server", "dataType" : "json", "data": { "Hello": "World" } }
Ha a REST API tartalomtípussal küld sztringetHello World
, az egyszerű WebSocket-ügyfél egy JSON-sztringet kap, amely dupla idézőjelekkel ("
) van "Hello World"
becsomagolva.application/json
3. eset: Bináris adatok küldése a kapcsolatra a REST API-val Content-Type
=application/octet-stream
Egy egyszerű WebSocket-ügyfél bináris WebSocket-keretet kap a bináris adatokkal.
A PubSub WebSocket-ügyfél a következőt kapja:
{ "type": "message", "from": "server", "dataType" : "binary", "data": "<base64_binary>" }
Rendszer válasza
A Web PubSub szolgáltatás rendszerhez kapcsolódó üzeneteket küld az ügyfeleknek.
Csatlakoztatva
Az ügyfélnek küldött üzenet, amikor az ügyfél sikeresen csatlakozik:
{
"type": "system",
"event": "connected",
"userId": "user1",
"connectionId": "abcdefghijklmnop",
}
Leválasztva
Az ügyfélnek küldött üzenet, amikor a kiszolgáló bezárja a kapcsolatot, vagy amikor a szolgáltatás elutasítja az ügyfelet.
{
"type": "system",
"event": "disconnected",
"message": "reason"
}
Következő lépések
Használja ezeket az erőforrásokat a saját alkalmazás létrehozásához: