Subprotocolo de WebSocket JSON compatible con Azure Web PubSub
El subprotocolo json WebSocket, json.webpubsub.azure.v1
, permite el intercambio de mensajes de publicación o suscripción entre clientes a través del servicio sin un recorrido de ida y vuelta al servidor ascendente. Una conexión WebSocket mediante el json.webpubsub.azure.v1
subprotocolo se denomina cliente WebSocket de PubSub.
Información general
Una conexión WebSocket simple desencadena un message
evento cuando envía mensajes y se basa en el lado servidor para procesar los mensajes y realizar otras operaciones.
Con el json.webpubsub.azure.v1
subprotocolo, puede crear clientes De PubSub WebSocket que pueden:
- unirse a un grupo mediante solicitudes de unión.
- publicar mensajes directamente en un grupo mediante solicitudes de publicación.
- enrutar mensajes a diferentes controladores de eventos ascendentes mediante solicitudes de eventos.
Por ejemplo, puede crear un cliente WebSocket de PubSub con el código JavaScript siguiente:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
En este documento se describen las solicitudes y respuestas de subprotocolos json.webpubsub.azure.v1
. Los marcos de datos entrantes y salientes deben contener cargas JSON.
Permisos
Un cliente webSocket de PubSub solo puede publicar en otros clientes cuando está autorizado. El roles
objeto asignado al cliente determina los permisos concedidos al cliente:
Role | Permiso |
---|---|
No especificado | El cliente puede enviar solicitudes de eventos. |
webpubsub.joinLeaveGroup |
El cliente puede unirse a cualquier grupo o abandonarlo. |
webpubsub.sendToGroup |
El cliente puede publicar mensajes en cualquier grupo. |
webpubsub.joinLeaveGroup.<group> |
El cliente puede unirse o dejar el grupo <group> . |
webpubsub.sendToGroup.<group> |
El cliente puede publicar mensajes en el grupo <group> . |
El servidor puede conceder o revocar dinámicamente permisos de cliente a través de api REST o SDK de servidor.
Requests
Unión a grupos
Formato:
{
"type": "joinGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
es la identidad de cada solicitud y debe ser única. El servicio envía un mensaje de respuesta de confirmación para notificar el resultado del proceso de la solicitud. Para obtener más información, consulte AckId y respuesta de Ack.
Salida de grupos
Formato:
{
"type": "leaveGroup",
"group": "<group_name>",
"ackId" : 1
}
ackId
es la identidad de cada solicitud y debe ser única. El servicio envía un mensaje de respuesta de confirmación para notificar el resultado del proceso de la solicitud. Para obtener más información, consulte AckId y respuesta de Ack.
Publicar mensajes
Formato:
{
"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
es la identidad de cada solicitud y debe ser única. El servicio envía un mensaje de respuesta de confirmación para notificar el resultado del proceso de la solicitud. Para obtener más información, consulte AckId y respuesta de Ack.noEcho
es opcional. Si se establece en true, este mensaje no se devuelve a la misma conexión. Si no se establece, el valor predeterminado es false.dataType
se puede establecer enjson
,text
obinary
:json
:data
puede ser cualquier tipo que JSON admita y se publicará como lo que sea. SidataType
no se especifica, el valor predeterminado esjson
.text
:data
debe estar en formato de cadena y se publicarán los datos de cadena.binary
:data
debe estar en formato base64 y se publicarán los datos binarios.
Caso 1: publicar datos de texto:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "text",
"data": "text data",
"ackId": 1
}
- Los clientes subprotocolos de
<group_name>
recepción:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "text",
"data" : "text data"
}
- Los clientes webSocket simples de
<group_name>
reciben la cadenatext data
.
Caso 2: publicar datos JSON:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "json",
"data": {
"hello": "world"
}
}
- Los clientes subprotocolos de
<group_name>
recepción:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "json",
"data" : {
"hello": "world"
}
}
- Los clientes webSocket simples de
<group_name>
reciben la cadena{"hello": "world"}
serializada .
Caso 3: publicar datos binarios:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "binary",
"data": "<base64_binary>",
"ackId": 1
}
- Los clientes subprotocolos de
<group_name>
recepción:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "binary",
"data" : "<base64_binary>",
}
- Los clientes webSocket simples en
<group_name>
reciben los datos binarios en el marco binario.
Envío de eventos personalizados
Formato:
{
"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
es la identidad de cada solicitud y debe ser única. El servicio envía un mensaje de respuesta de confirmación para notificar el resultado del proceso de la solicitud. Para obtener más información, consulte AckId y respuesta de Ack.
dataType
puede ser de tipo text
, binary
o json
:
json
: los datos pueden ser cualquier tipo que admita json y se publicarán como lo que es; El valor predeterminado esjson
.text
: los datos están en formato de cadena y se publicarán los datos de cadena;binary
: los datos están en formato base64 y se publicarán los datos binarios;
Caso 1: envío de eventos con datos de texto:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "text",
"data": "text data",
}
El controlador de eventos ascendente recibe datos similares a los siguientes:
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
El Content-Type
para la solicitud HTTP de CloudEvents es text/plain
cuando dataType
es text
.
Caso 2: envío de eventos con datos JSON:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json",
"data": {
"hello": "world"
},
}
El controlador de eventos ascendente recibe datos similares a los siguientes:
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"
}
El Content-Type
para la solicitud HTTP de CloudEvents es application/json
cuando dataType
es json
Caso 3: envío de eventos con datos binarios:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "binary",
"data": "base64_binary",
}
El controlador de eventos ascendente recibe datos similares a los siguientes:
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
El Content-Type
para la solicitud HTTP de CloudEvents es application/octet-stream
cuando dataType
es binary
. El marco de WebSocket puede tener formato text
para marcos de mensajes de texto o binarios con codificación UTF8 para marcos de mensaje binary
.
El servicio Web PubSub rechaza el cliente si el mensaje no coincide con el formato descrito.
Respuestas
Los tipos de mensaje recibidos por el cliente pueden ser:
- ack: la respuesta a una solicitud que contiene .
ackId
- message: mensajes del grupo o servidor.
- system: mensajes del servicio Web PubSub.
Respuesta de confirmación
Cuando la solicitud de cliente contiene ackId
, el servicio devolverá una respuesta de confirmación para la solicitud. El cliente debe controlar el mecanismo de confirmación, esperando la respuesta de confirmación con una async
await
operación y usando una operación de tiempo de espera cuando la respuesta de confirmación no se recibe en un período determinado.
Formato:
{
"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>"
}
}
La implementación del cliente debe comprobar siempre si success
es true
o false
primero y, a continuación, solo leer el error cuando success
es false
.
Respuesta del mensaje
Los clientes pueden recibir mensajes publicados desde un grupo al que el cliente se ha unido o desde el servidor, que, funcionando en un rol de administración de servidores, envía mensajes a clientes o usuarios específicos.
Cuando el mensaje es de un grupo.
{ "type": "message", "from": "group", "group": "<group_name>", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType "fromUserId": "abc" }
Cuando el mensaje es sea del servidor.
{ "type": "message", "from": "server", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType }
Caso 1: envío de datos Hello World
a la conexión a través de la API REST con Content-Type
=text/plain
Un cliente webSocket simple recibe un marco webSocket de texto con datos:
Hello World
;Un cliente webSocket de PubSub recibe:
{ "type": "message", "from": "server", "dataType" : "text", "data": "Hello World", }
Caso 2: envío de datos { "Hello" : "World"}
a la conexión a través de la API REST con Content-Type
=application/json
Un cliente webSocket simple recibe un marco webSocket de texto con datos con cadena:
{ "Hello" : "World"}
.Un cliente webSocket de PubSub recibe:
{ "type": "message", "from": "server", "dataType" : "json", "data": { "Hello": "World" } }
Si la API REST envía una cadena Hello World
mediante el tipo de contenido, el cliente webSocket simple recibe una cadena JSON, que se "Hello World"
ajusta con comillas dobles ("
application/json
).
Caso 3: envío de datos binarios a la conexión a través de la API REST con Content-Type
=application/octet-stream
Un cliente webSocket simple recibe un marco binario de WebSocket con los datos binarios.
Un cliente webSocket de PubSub recibe:
{ "type": "message", "from": "server", "dataType" : "binary", "data": "<base64_binary>" }
Respuesta del sistema
El servicio Web PubSub envía mensajes relacionados con el sistema a los clientes.
Conectado
Mensaje enviado al cliente cuando el cliente se conecta correctamente:
{
"type": "system",
"event": "connected",
"userId": "user1",
"connectionId": "abcdefghijklmnop",
}
Escenario desconectado
Mensaje enviado al cliente cuando el servidor cierra la conexión o cuando el servicio rechaza el cliente.
{
"type": "system",
"event": "disconnected",
"message": "reason"
}
Pasos siguientes
Use estos recursos para empezar a compilar su propia aplicación: