Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
JSON WebSocket-delprotokol json.webpubsub.azure.v1, , möjliggör utbyte av publicera/prenumerera meddelanden mellan klienter via tjänsten utan en tur och retur till den överordnade servern. En WebSocket-anslutning med hjälp av delprotokolen json.webpubsub.azure.v1 kallas för en PubSub WebSocket-klient.
Översikt
En enkel WebSocket-anslutning utlöser en message händelse när den skickar meddelanden och förlitar sig på serversidan för att bearbeta meddelanden och utföra andra åtgärder.
Med subprotokolen json.webpubsub.azure.v1 kan du skapa PubSub WebSocket-klienter som kan:
- gå med i en grupp med hjälp av anslutningsbegäranden.
- publicera meddelanden direkt till en grupp med publiceringsbegäranden.
- Strömma meddelanden direkt till en grupp med hjälp av strömningsförfrågningar.
- dirigera meddelanden till olika överordnade händelsehanterare med hjälp av händelsebegäranden.
Du kan till exempel skapa en PubSub WebSocket-klient med följande JavaScript-kod:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
I det här dokumentet beskrivs undergruppsbegäranden json.webpubsub.azure.v1 och svar. Både inkommande och utgående dataramar måste innehålla JSON-nyttolaster.
Behörigheter
En PubSub WebSocket-klient kan bara publicera till andra klienter när den är auktoriserad. Den roles tilldelade klienten avgör vilka behörigheter som beviljats klienten:
| Roll | Behörighet |
|---|---|
| Har inte angetts | Klienten kan skicka händelsebegäranden. |
webpubsub.joinLeaveGroup |
Klienten kan ansluta/lämna valfri grupp. |
webpubsub.sendToGroup |
Klienten kan publicera meddelanden till valfri grupp. |
webpubsub.joinLeaveGroup.<group> |
Klienten kan ansluta/lämna gruppen <group>. |
webpubsub.sendToGroup.<group> |
Klienten kan publicera meddelanden till gruppen <group>. |
webpubsub.joinLeaveGroups.<pattern> |
Klienten kan ansluta/lämna valfri grupp vars namn matchar <pattern> (se Mönster för jokerteckengrupproll). |
webpubsub.sendToGroups.<pattern> |
Klienten kan publicera meddelanden till alla grupper vars namn matchar <pattern> (se Mönster för jokerteckengrupproll). |
Servern kan dynamiskt bevilja eller återkalla klientbehörigheter via REST-API:er eller server-SDK:er.
Anmärkning
Jokerteckenroller (t.ex. webpubsub.sendToGroups.<pattern>) stöds inte i REST-API:er eller server-SDK:er under körning ännu.
begäranden
Koppla grupper
Format:
{
"type": "joinGroup",
"group": "<group_name>",
"ackId" : 1
}
-
ackIdär identiteten för varje begäran och bör vara unik. Tjänsten skickar ett ack-svarsmeddelande för att meddela processresultatet för begäran. Mer information finns i AckId och Ack-svar
Lämna grupper
Format:
{
"type": "leaveGroup",
"group": "<group_name>",
"ackId" : 1
}
-
ackIdär identiteten för varje begäran och bör vara unik. Tjänsten skickar ett ack-svarsmeddelande för att meddela processresultatet för begäran. Mer information finns i AckId och Ack-svar
Publicera meddelanden
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är identiteten för varje begäran och bör vara unik. Tjänsten skickar ett ack-svarsmeddelande för att meddela processresultatet för begäran. Mer information finns i AckId och Ack-svar -
noEchoär valfritt. Om värdet är true upprepas inte det här meddelandet till samma anslutning. Om det inte anges är standardvärdet falskt. -
dataTypekan anges tilljson,textellerbinary:-
json:datakan vara vilken typ som helst som JSON stöder och publiceras som vad det är. OmdataTypeinte har angetts är standardvärdetjson. -
text:dataska vara i strängformat och strängdata publiceras. -
binary:databör vara i base64-format och binära data publiceras.
-
Fall 1: Publicera textdata:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "text",
"data": "text data",
"ackId": 1
}
- De subprotokolklienter som finns i
<group_name>tar emot:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "text",
"data" : "text data"
}
- De enkla WebSocket-klienterna i
<group_name>tar emot strängentext data.
Fall 2: Publicera JSON-data:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "json",
"data": {
"hello": "world"
}
}
- De subprotokolklienter som finns i
<group_name>tar emot:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "json",
"data" : {
"hello": "world"
}
}
- De enkla WebSocket-klienterna i
<group_name>tar emot den serialiserade strängen{"hello": "world"}.
Fall 3: Publicera binära data:
{
"type": "sendToGroup",
"group": "<group_name>",
"dataType" : "binary",
"data": "<base64_binary>",
"ackId": 1
}
- De subprotokolklienter som finns i
<group_name>tar emot:
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType" : "binary",
"data" : "<base64_binary>",
}
- De enkla WebSocket-klienterna i
<group_name>tar emot binära data i den binära ramen.
Börja strömma meddelanden
För att starta en gruppström, skicka en sendToGroup förfrågan med egenskapen stream . En strömstartsförfrågan innehåller datainte , dataType, eller ackId.
Format:
{
"type": "sendToGroup",
"group": "<group_name>",
"noEcho": true|false,
"stream": {
"streamId": "<stream_id>",
"idleTimeoutMs": 300000
}
}
-
stream.streamIdär identifieraren för den logiska strömmen. Det måste vara en icke-tom sträng och vara unik bland aktiva strömmar på samma klientanslutning. Klientbibliotek rekommenderas för att generera ett globalt unikt värde, såsom en GUID eller UUID. -
stream.idleTimeoutMsär valfritt. Om specificerat måste den vara större än0. Om den utelämnas är servicestandarden millisekunder300000. Värdet är en inaktiv timeout, inte en total strömlivslängd. Skicka strömdata, skicka en ström som hålls vid liv, eller avsluta strömmen innan denna timeout går ut när applikationen behöver hålla strömmen öppen. -
noEchoär valfritt. Om det är sant inställt på true skickas inte streammeddelanden tillbaka till samma anslutning. Om det inte anges är standardvärdet falskt.
När strömmen accepteras får klienten ett ström-ack-svar med expectedSequenceId satt till 1.
Skicka strömmande data
För att skicka strömdata, skicka en streamData förfrågan med streamId, streamSequenceId, dataType, och data.
Format:
{
"type": "streamData",
"streamId": "<stream_id>",
"streamSequenceId": 1,
"dataType" : "json|text|binary",
"data": {}
}
-
streamIdidentifierar en aktiv ström på samma klientanslutning. -
streamSequenceIdär ett positivt UINT64-tal. Det första datafragmentet i en ström använder1, och varje efterföljande datafragment för sammastreamIdökar med exakt1. -
dataTypekan sättas tilljson,text, ellerbinary, med samma datakodningsregler som publiceringsmeddelanden.
För att hålla en ström aktiv utan att leverera data till prenumeranter, skicka en streamData förfrågan med endast type och streamId.
{
"type": "streamData",
"streamId": "<stream_id>"
}
Avsluta strömningsmeddelanden
För att avsluta en stream, skicka en streamEnd förfrågan.
Format:
{
"type": "streamEnd",
"streamId": "<stream_id>"
}
För att avsluta en ström med ett applikationsdefinierat fel, inkludera den valfria error egenskapen.
{
"type": "streamEnd",
"streamId": "<stream_id>",
"error": {
"message": "<error_detail>",
"userErrorCode": "<application_error_code>"
}
}
-
error.messageär ett valfritt mänskligt läsbart felmeddelande. -
error.userErrorCodeär en valfri felkod definierad av applikationen.
När strömmen stängs får utgivaren ett svar om strömmen stängd.
Skicka anpassade händelser
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är identiteten för varje begäran och bör vara unik. Tjänsten skickar ett ack-svarsmeddelande för att meddela processresultatet för begäran. Mer information finns i AckId och Ack-svar
dataType kan vara en av text, binaryeller json:
-
json: data kan vara alla typer av json-stöd och publiceras som vad de är. Standardvärdet ärjson. -
text: data är i strängformat och strängdata publiceras. -
binary: data är i base64-format och binära data publiceras.
Fall 1: Skicka händelse med textdata:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "text",
"data": "text data",
}
Den överordnade händelsehanteraren tar emot data som liknar:
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 HTTP-begäran för CloudEvents är när text/plain är dataTypetext.
Fall 2: Skicka händelse med JSON-data:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "json",
"data": {
"hello": "world"
},
}
Den överordnade händelsehanteraren tar emot data som liknar:
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 HTTP-begäran för CloudEvents är när application/json är dataTypejson
Fall 3: Skicka händelse med binära data:
{
"type": "event",
"event": "<event_name>",
"ackId": 1,
"dataType" : "binary",
"data": "base64_binary",
}
Den överordnade händelsehanteraren tar emot data som liknar:
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 HTTP-begäran för CloudEvents är när application/octet-stream är dataTypebinary. WebSocket-ramen kan vara text formaterad för textmeddelanderamar eller UTF8-kodade binärfiler för binary meddelanderamar.
Web PubSub-tjänsten nekar klienten om meddelandet inte matchar det beskrivna formatet.
Ping
Format:
{
"type": "ping",
}
Klienten kan skicka ett ping meddelande till tjänsten för att göra det möjligt för Web PubSub-tjänsten att identifiera klientens livskraft.
Svar
Meddelandetyper som tas emot av klienten kan vara:
- ack – Svaret på en begäran som innehåller en
ackId. - message – Meddelanden från gruppen eller servern.
- system – Meddelanden från Web PubSub-tjänsten.
- pong – Svaret på ett
pingmeddelande. - streamAck – Svaret som bekräftar accepterad strömdata och rapporterar nästa förväntade strömsekvens-ID.
- streamNack – Svaret vid ett återkallbart strömfel.
- streamClosed – Svaret på terminalens publiceringssida av stream.
Ack-svar
När klientbegäran innehåller returnerar ackIdtjänsten ett ack-svar för begäran. Klienten ska hantera ack-mekanismen genom att vänta på ack-svaret med en asyncawait åtgärd och använda en timeout-åtgärd när ack-svaret inte tas emot under en viss period.
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>"
}
}
Klientimplementeringen SKA alltid kontrollera om success är true eller false först och sedan bara läsa felet när success är false.
Meddelandesvar
Klienter kan ta emot meddelanden som publicerats från en grupp som klienten har anslutit eller från servern, som i en serverhanteringsroll skickar meddelanden till specifika klienter eller användare.
När meddelandet kommer från en grupp
{ "type": "message", "from": "group", "group": "<group_name>", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType "fromUserId": "abc" }När meddelandet kommer från servern.
{ "type": "message", "from": "server", "dataType": "json|text|binary", "data" : {} // The data format is based on the dataType }
Fall 1: Skicka data Hello World till anslutningen via REST API med Content-Type=text/plain
En enkel WebSocket-klient tar emot en WebSocket-textram med data:
Hello World;En PubSub WebSocket-klient tar emot:
{ "type": "message", "from": "server", "dataType" : "text", "data": "Hello World", }
Fall 2: Skicka data { "Hello" : "World"} till anslutningen via REST API med Content-Type=application/json
En enkel WebSocket-klient tar emot en WebSocket-textram med strängifierade data:
{ "Hello" : "World"}.En PubSub WebSocket-klient tar emot:
{ "type": "message", "from": "server", "dataType" : "json", "data": { "Hello": "World" } }
Om REST-API:et skickar en sträng Hello World med hjälp av application/json innehållstypen får den enkla WebSocket-klienten en JSON-sträng, som är "Hello World" omsluten med dubbla citattecken (").
Fall 3: Skicka binära data till anslutningen via REST API med Content-Type=application/octet-stream
En enkel WebSocket-klient tar emot en binär WebSocket-ram med binära data.
En PubSub WebSocket-klient tar emot:
{ "type": "message", "from": "server", "dataType" : "binary", "data": "<base64_binary>" }
Svar på strömmande meddelande
När ett meddelande tillhör en ström innehåller gruppmeddelandet en stream egenskap.
{
"type": "message",
"from": "group",
"group": "<group_name>",
"dataType": "json|text|binary",
"data": {},
"fromUserId": "abc",
"stream": {
"streamId": "<stream_id>",
"streamSequenceId": 1,
"endOfStream": true,
"error": {
"name": "IdleTimeout|InternalServerError|Forbidden|Cancelled|UserError",
"message": "<error_detail>",
"userErrorCode": "<application_error_code>"
}
}
}
-
stream.streamIdär den logiska strömidentifieraren. -
stream.streamSequenceIdär sekvensnumret för meddelandet i strömmen. -
stream.endOfStreamär valfritt. När det sätts tilltrueär meddelandet strömmens terminalmeddelande. -
stream.errorär valfritt och finns endast när strömmen avslutas med ett fel.userErrorCodeär endast närvarande förUserError.
Stream ack-respons
Tjänsten skickar ett streamAck svar för att bekräfta accepterad strömdata och rapportera nästa strömsekvens-ID den förväntar sig.
Format:
{
"type": "streamAck",
"streamId": "<stream_id>",
"expectedSequenceId": 2
}
Stream nack-respons
Tjänsten skickar ett streamNack svar på ett återförhållbart strömfel.
Format:
{
"type": "streamNack",
"streamId": "<stream_id>",
"expectedSequenceId": 2,
"name": "InvalidSequenceId|TransientError",
"message": "<error_detail>"
}
Strömstängt respons
Tjänsten skickar ett streamClosed svar när strömmen på publicistsidan stängs.
Format:
{
"type": "streamClosed",
"streamId": "<stream_id>",
"error": {
"name": "StreamNotFound|Forbidden|BadRequest|InternalServerError|IdleTimeout",
"message": "<error_detail>"
}
}
Fastigheten error utelämnas när bäcken stängs normalt.
Systemsvar
Tjänsten Web PubSub skickar systemrelaterade meddelanden till klienter.
Pong-svar
Tjänsten Web PubSub skickar ett pong meddelande till klienten när den tar emot ett ping meddelande från klienten.
Format:
{
"type": "pong",
}
Connected
Meddelandet som skickas till klienten när klienten ansluter:
{
"type": "system",
"event": "connected",
"userId": "user1",
"connectionId": "abcdefghijklmnop",
}
Frånkopplad
Meddelandet som skickas till klienten när servern stänger anslutningen eller när tjänsten nekar klienten.
{
"type": "system",
"event": "disconnected",
"message": "reason"
}
Nästa steg
Använd dessa resurser för att börja skapa ett eget program: