Поддерживаемый в Azure Web PubSub подпротокол JSON WebSocket
Subprotocol json.webpubsub.azure.v1
JSON WebSocket позволяет обмениваться сообщениями публикации и подписки между клиентами через службу без кругового пути к вышестоящему серверу. Подключение WebSocket с помощью json.webpubsub.azure.v1
подпротокола называется клиентом PubSub WebSocket.
Обзор
Простое подключение WebSocket активирует message
событие при отправке сообщений и использует серверную сторону для обработки сообщений и выполнения других операций.
json.webpubsub.azure.v1
С помощью подпротокола можно создать клиенты PubSub WebSocket, которые могут:
- присоединяйтесь к группе с помощью запросов на присоединение.
- публикация сообщений непосредственно в группе с помощью запросов публикации.
- перенаправляйте сообщения в различные обработчики событий вышестоящего потока с помощью запросов на события.
Например, можно создать клиент PubSub WebSocket со следующим кодом JavaScript:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
В этом документе описываются запросы и ответы подпротокола json.webpubsub.azure.v1
. Входящие и исходящие кадры данных должны содержать полезные данные JSON.
Разрешения
Клиент PubSub WebSocket может публиковаться только в других клиентах, когда он авторизован. Назначенные roles
клиенту разрешения определяются клиентом:
Роль | Разрешение |
---|---|
Не указано | Клиент может отправлять запросы событий. |
webpubsub.joinLeaveGroup |
Клиент может присоединиться к любой группе или выйти из нее. |
webpubsub.sendToGroup |
Клиент может публиковать сообщения в любой группе. |
webpubsub.joinLeaveGroup.<group> |
Клиент может присоединиться или оставить группу <group> . |
webpubsub.sendToGroup.<group> |
Клиент может публиковать сообщения в группе <group> . |
Сервер может динамически предоставлять или отзывать разрешения клиента с помощью REST API или пакетов SDK сервера.
Запросы
Присоединение к группам
Формат:
{
"type": "joinGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
— это удостоверение каждого запроса и должно быть уникальным. Служба отправляет ответное сообщение об ошибке, чтобы уведомить результат процесса запроса. Дополнительные сведения см. в разделе "Ответ AckId" и "Ack Response"
Выход из групп
Формат:
{
"type": "leaveGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
— это удостоверение каждого запроса и должно быть уникальным. Служба отправляет ответное сообщение об ошибке, чтобы уведомить результат процесса запроса. Дополнительные сведения см. в разделе "Ответ AckId" и "Ack Response"
публикация сообщений.
Формат:
{
"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
— это удостоверение каждого запроса и должно быть уникальным. Служба отправляет ответное сообщение об ошибке, чтобы уведомить результат процесса запроса. Дополнительные сведения см. в разделе "Ответ AckId" и "Ack Response"noEcho
является необязательным. Если задано значение true, это сообщение не повторяется в том же соединении. Если значение не задано, значение по умолчанию равно false.dataType
может быть задано значениеjson
,text
илиbinary
:json
:data
может относиться к любому типу, поддерживаемому JSON, и публикуется в том же формате. Если не указатьdataType
, по умолчанию используется форматjson
.text
: значениеdata
должно быть представлено в строковом формате, и публикуются строковые данные;binary
: значениеdata
должно быть представлено в формате base64, и публикуются двоичные данные;
Сценарий 1. Публикация текстовых данных:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "text",
"data": "text data",
"ackId": 1
}
- Клиенты подпротокола получают
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "text",
"data" : "text data"
}
- Простые клиенты WebSocket в
<group_name>
строкеtext data
.
Сценарий 2. Публикация данных JSON:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "json",
"data": {
"hello": "world"
}
}
- Клиенты подпротокола получают
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "json",
"data" : {
"hello": "world"
}
}
- Простые клиенты WebSocket в
<group_name>
получении сериализованной строки{"hello": "world"}
.
Сценарий 3. Публикация двоичных данных:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "binary",
"data": "<base64_binary>",
"ackId": 1
}
- Клиенты подпротокола получают
<group_name>
:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "binary",
"data" : "<base64_binary>",
}
- Простые клиенты WebSocket получают
<group_name>
двоичные данные в двоичном кадре.
Отправка пользовательских событий
Формат:
{
"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
— это удостоверение каждого запроса и должно быть уникальным. Служба отправляет ответное сообщение об ошибке, чтобы уведомить результат процесса запроса. Дополнительные сведения см. в разделе "Ответ AckId" и "Ack Response"
Для атрибута dataType
можно задать значение text
, binary
или json
:
json
: данные могут быть любым типом json, поддерживаемым и будут опубликованы как то, что это; Значение по умолчанию —json
.text
: данные в строковом формате, а строковые данные будут опубликованы;binary
: данные в формате base64, а двоичные данные будут опубликованы;
Сценарий 1. Отправка события с текстовыми данными:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "text",
"data": "text data",
}
Обработчик событий вышестоящего потока получает данные, аналогичные следующим:
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
Http-запрос Content-Type
CloudEvents находится text/plain
в том случае.text
dataType
Сценарий 2. Отправка события с данными JSON:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json",
"data": {
"hello": "world"
},
}
Обработчик событий вышестоящего потока получает данные, аналогичные следующим:
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"
}
Http-запрос Content-Type
CloudEvents — application/json
это время dataType
json
Сценарий 3. Отправка события с двоичными данными:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "binary",
"data": "base64_binary",
}
Обработчик событий вышестоящего потока получает данные, аналогичные следующим:
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
Http-запрос Content-Type
CloudEvents находится application/octet-stream
в том случае.binary
dataType
Кадр WebSocket может быть представлен в формате text
для кадров текстовых сообщений или двоичных данных с кодировкой UTF8 для кадров сообщений binary
.
Служба Web PubSub отклоняет клиент, если сообщение не соответствует описанному формату.
Отклики
Типы сообщений, полученные клиентом, могут быть:
- ack — ответ на запрос, содержащий объект
ackId
. - message — сообщения из группы или сервера.
- system — сообщения из службы Web PubSub.
Отклик ACK
Если запрос клиента содержит ackId
, служба вернет ответ ack для запроса. Клиент должен обрабатывать механизм ack, ожидая ответа ack с async
await
операцией и используя операцию тайм-аута, когда ответ ack не получен в определенный период.
Формат:
{
"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>"
}
}
Реализация клиента всегда должна проверять, является true
ли success
она или false
первой, а затем только считывает ошибку при success
наличииfalse
.
Ответ на сообщение
Клиенты могут получать сообщения, опубликованные из группы, к которой клиент присоединился или с сервера, который, работающий в роли управления сервером, отправляет сообщения определенным клиентам или пользователям.
Если сообщение отправлено из группы:
{ "type": "message", "from": "group", "group": "<group_name>", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType "fromUserId": "abc" }
Когда сообщение находится на сервере.
{ "type": "message", "from": "server", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType }
Сценарий 1. Отправка данных Hello World
подключению при помощи REST API с Content-Type
=text/plain
Простой клиент WebSocket получает текстовый кадр WebSocket с данными:
Hello World
Клиент PubSub WebSocket получает:
{ "type": "message", "from": "server", "dataType" : "text", "data": "Hello World", }
Сценарий 2. Отправка данных { "Hello" : "World"}
подключению при помощи REST API с Content-Type
=application/json
Простой клиент WebSocket получает текстовый кадр WebSocket со строковыми данными:
{ "Hello" : "World"}
Клиент PubSub WebSocket получает:
{ "type": "message", "from": "server", "dataType" : "json", "data": { "Hello": "World" } }
Если REST API отправляет строку Hello World
с помощью application/json
типа контента, простой клиент WebSocket получает строку JSON, которая упаковывается "Hello World"
с двойными кавычками ("
).
Сценарий 3. Отправка двоичных данных подключению при помощи REST API с Content-Type
=application/octet-stream
Простой клиент WebSocket получает двоичный кадр WebSocket с двоичными данными.
Клиент PubSub WebSocket получает:
{ "type": "message", "from": "server", "dataType" : "binary", "data": "<base64_binary>" }
Отклик системы
Служба Web PubSub отправляет системные сообщения клиентам.
Connected
Сообщение, отправленное клиенту при успешном подключении клиента:
{
"type": "system",
"event": "connected",
"userId": "user1",
"connectionId": "abcdefghijklmnop",
}
Отключено
Сообщение, отправленное клиенту, когда сервер закрывает подключение, или когда служба отказывается от клиента.
{
"type": "system",
"event": "disconnected",
"message": "reason"
}
Следующие шаги
Используйте эти ресурсы для начала создания собственного приложения: