Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit document wordt het subprotocol protobuf.webpubsub.azure.v1beschreven.
Wanneer een client dit subprotocol gebruikt, worden zowel de uitgaande als de binnenkomende gegevensframes naar verwachting protocolbuffers (protobuf) nettoladingen.
Overzicht
Subprotocol protobuf.webpubsub.azure.v1 stelt de client in staat om rechtstreeks een publish-subscribe (PubSub) uit te voeren in plaats van een retour naar de upstream-server uit te voeren. De WebSocket-verbinding met het protobuf.webpubsub.azure.v1 subprotocol wordt een PubSub WebSocket-client genoemd.
In JavaScript kunt u bijvoorbeeld een PubSub WebSocket-client maken met het protobuf-subprotocol met behulp van:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'protobuf.webpubsub.azure.v1');
Voor een eenvoudige WebSocket-client heeft de server de benodigde rol voor het verwerken van gebeurtenissen van clients. Een eenvoudige WebSocket-verbinding activeert altijd een message gebeurtenis wanneer berichten worden verzonden en is altijd afhankelijk van de serverzijde om berichten te verwerken en andere bewerkingen uit te voeren. Met behulp van het protobuf.webpubsub.azure.v1 subprotocol kan een geautoriseerde client lid worden van een groep door join-aanvragen te gebruiken en berichten rechtstreeks naar een groep te publiceren met behulp van publicatieaanvragen . De client kan ook berichten doorsturen naar verschillende upstream gebeurtenis-handlers met behulp van gebeurtenisaanvragen om de gebeurtenis waartoe het bericht behoort aan te passen.
Notitie
Momenteel ondersteunt de Web PubSub-service alleen proto3.
Machtigingen
Een PubSub WebSocket-client kan alleen publiceren naar andere clients wanneer deze is geautoriseerd. De roles toegewezen aan de client bepaalt de machtigingen die aan de client zijn verleend:
| Role | Machtiging |
|---|---|
| Niet opgegeven | De client kan gebeurtenisaanvragen verzenden. |
webpubsub.joinLeaveGroup |
De client kan lid worden van elke groep of elke groep verlaten. |
webpubsub.sendToGroup |
De client kan berichten publiceren naar elke groep. |
webpubsub.joinLeaveGroup.<group> |
De client kan deelnemen aan/verlaten van de groep <group>. |
webpubsub.sendToGroup.<group> |
De client kan berichten naar de groep <group>publiceren. |
De server kan clientmachtigingen dynamisch verlenen of intrekken via REST API's of server-SDK's.
Verzoeken
Alle aanvraagberichten voldoen aan de volgende protobuf-indeling:
syntax = "proto3";
import "google/protobuf/any.proto";
message UpstreamMessage {
oneof message {
SendToGroupMessage send_to_group_message = 1;
EventMessage event_message = 5;
JoinGroupMessage join_group_message = 6;
LeaveGroupMessage leave_group_message = 7;
SequenceAckMessage sequence_ack_message = 8;
PingMessage ping_message = 9;
}
message SendToGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
MessageData data = 3;
}
message EventMessage {
string event = 1;
MessageData data = 2;
optional uint64 ack_id = 3;
}
message JoinGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
}
message LeaveGroupMessage {
string group = 1;
optional uint64 ack_id = 2;
}
message PingMessage {
}
}
message MessageData {
oneof data {
string text_data = 1;
bytes binary_data = 2;
google.protobuf.Any protobuf_data = 3;
}
}
Deelnemen aan groepen
Indeling:
Stel join_group_message.group deze in op de groepsnaam.
-
ackIdis de identiteit van elke aanvraag en moet uniek zijn. De service verzendt een ack-antwoordbericht om het procesresultaat van de aanvraag te melden. Meer informatie vindt u op AckId en Ack Response
Groepen verlaten
Indeling:
Stel leave_group_message.group deze in op de groepsnaam.
-
ackIdis de identiteit van elke aanvraag en moet uniek zijn. De service verzendt een ack-antwoordbericht om het procesresultaat van de aanvraag te melden. Meer informatie vindt u op AckId en Ack Response
Berichten publiceren
Indeling:
ackId: De unieke identiteit van elke aanvraag. De service verzendt een ack-antwoordbericht om het procesresultaat van de aanvraag op de hoogte te stellen. Meer informatie vindt u op AckId en Ack ResponsedataType: De gegevensindeling, die kan zijnprotobuf,textofbinaryafhankelijk van dedatainMessageData. De ontvangende clients kunnen dedataTypeinhoud correct verwerken.protobuf: Wanneer u insteltsend_to_group_message.data.protobuf_data, is de implicietedataType.protobufprotobuf_datakan van het type Willekeurig bericht zijn. Alle andere clients ontvangen een protobuf-gecodeerd binair bestand, dat kan worden gedeserialiseerd door de protobuf SDK. Clients die alleen inhoud op basis van tekst ondersteunen (bijvoorbeeldjson.webpubsub.azure.v1) ontvangen een binair bestand met Base64-codering.text: Wanneer u insteltsend_to_group_message.data.text_data, is de implicietedataType.texttext_datamoet een tekenreeks zijn. Alle clients met andere protocollen ontvangen een UTF-8-gecodeerde tekenreeks.binary: Wanneer u insteltsend_to_group_message.data.binary_data, is de implicietedataType.binarybinary_datamoet een bytematrix zijn. Alle clients met andere protocollen ontvangen een onbewerkt binair bestand zonder protobuf-codering. Clients die alleen inhoud op basis van tekst ondersteunen (bijvoorbeeldjson.webpubsub.azure.v1) ontvangen een binair bestand met Base64-codering.
Case 1: Tekstgegevens publiceren
Ingesteld send_to_group_message.group op group, en ingesteld op "text data"send_to_group_message.data.text_data .
De protobuf-subprotocolclient in groep
groupontvangt het binaire frame en kan DownstreamMessage gebruiken om het te deserialiseren.De JSON-subprotocolclients ontvangen
group:{ "type": "message", "from": "group", "group": "group", "dataType" : "text", "data" : "text data" }De eenvoudige WebSocket-clients in
groupde ontvangsttekenreekstext data.
Case 2: Protobuf-gegevens publiceren
Stel dat u een aangepast bericht hebt:
message MyMessage {
int32 value = 1;
}
Ingesteld send_to_group_message.group op group en send_to_group_message.data.protobuf_data naar Any.pack(MyMessage) met value = 1.
De protobuf-subprotocolclients ontvangen
grouphet binaire frame en kunnen DownstreamMessage gebruiken om het te deserialiseren.De subprotocolclient ontvangt
group:{ "type": "message", "from": "group", "group": "G", "dataType" : "protobuf", "data" : "Ci90eXBlLmdvb2dsZWFwaXMuY29tL2F6dXJlLndlYnB1YnN1Yi5UZXN0TWVzc2FnZRICCAE=" // Base64-encoded bytes }Notitie
De gegevens zijn een met Base64 gecodeerde, deserializeable protobuf binary.
U kunt de volgende protobuf-definitie gebruiken en gebruiken Any.unpack() om deze te deserialiseren:
syntax = "proto3";
message MyMessage {
int32 value = 1;
}
De eenvoudige WebSocket-clients ontvangen
grouphet binaire frame:# Show in hexadecimal 0A 2F 74 79 70 65 2E 67 6F 6F 67 6C 65 61 70 69 73 2E 63 6F 6D 2F 61 7A 75 72 65 2E 77 65 62 70 75 62 73 75 62 2E 54 65 73 74 4D 65 73 73 61 67 65 12 02 08 01
Case 3: Binaire gegevens publiceren
Ingesteld send_to_group_message.group op group, en ingesteld op [1, 2, 3]send_to_group_message.data.binary_data .
De protobuf-subprotocolclient in groep
groupontvangt het binaire frame en kan DownstreamMessage gebruiken om het te deserialiseren.De JSON-subprotocolclient in de groep
groupontvangt:{ "type": "message", "from": "group", "group": "group", "dataType" : "binary", "data" : "AQID", // Base64-encoded [1,2,3] }Omdat de JSON-subprotocolclient alleen op tekst gebaseerde berichten ondersteunt, wordt het binaire bestand altijd Base64-gecodeerd.
De eenvoudige WebSocket-clients ontvangen
groupde binaire gegevens in het binaire frame:# Show in hexadecimal 01 02 03
Aangepaste gebeurtenissen verzenden
Er is een impliciete dataType, die kan zijn protobuf, textof binary, afhankelijk van de dataType door u ingestelde set. De ontvangerclients kunnen de dataType inhoud correct verwerken.
protobuf: Wanneer u insteltevent_message.data.protobuf_data, is de implicietedataType.protobufDeprotobuf_datawaarde kan elk ondersteund protobuf-type zijn. De gebeurtenis-handler ontvangt het protobuf-gecodeerde binaire bestand, dat kan worden gedeserialiseerd door elke protobuf SDK.text: Wanneer u insteltevent_message.data.text_data, is de implicietedataType.textDetext_datawaarde moet een tekenreeks zijn. De gebeurtenis-handler ontvangt een UTF-8-gecodeerde tekenreeks.binary: Wanneer u insteltevent_message.data.binary_data, is de implicietedataType.binaryDebinary_datawaarde moet een bytematrix zijn. De gebeurtenishandler ontvangt het onbewerkte binaire frame.
Case 1: Een gebeurtenis met tekstgegevens verzenden
Stel event_message.data.text_data in op "text data".
De upstream-gebeurtenis-handler ontvangt een aanvraag die vergelijkbaar is met:
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
De Content-Type voor de CloudEvents HTTP-aanvraag is text/plain, waar=dataTypetext .
Case 2: Een gebeurtenis met protobuf-gegevens verzenden
Stel dat u het volgende klantbericht hebt ontvangen:
message MyMessage {
int32 value = 1;
}
Ingesteld event_message.data.protobuf_data op any.pack(MyMessage) met value = 1
De upstream-gebeurtenis-handler ontvangt een aanvraag die vergelijkbaar is met:
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>
// Just show in hexadecimal; read it as binary
0A 2F 74 79 70 65 2E 67 6F 6F 67 6C 65 61 70 69 73 2E 63 6F 6D 2F 61 7A 75 72 65 2E 77 65 62 70 75 62 73 75 62 2E 54 65 73 74 4D 65 73 73 61 67 65 12 02 08 01
De Content-Type voor de CloudEvents HTTP-aanvraag is application/x-protobuf, waar=dataTypeprotobuf .
De gegevens zijn een geldig protobuf binair bestand. U kunt het volgende proto gebruiken en any.unpack() deze deserialiseren:
syntax = "proto3";
message MyMessage {
int32 value = 1;
}
Case 3: Een gebeurtenis met binaire gegevens verzenden
Stel send_to_group_message.binary_data in op [1, 2, 3].
De upstream-gebeurtenis-handler ontvangt een aanvraag die vergelijkbaar is met:
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>
// Just show in hexadecimal; you need to read it as binary
01 02 03
Voor dataType=binaryde HTTP-aanvraag van CloudEvents is application/octet-streamdatContent-Type. Het WebSocket-frame kan een text indeling hebben voor tekstberichtframes of UTF-8 gecodeerde binaire bestanden voor binary berichtframes.
De service weigert de client als het bericht niet overeenkomt met de voorgeschreven indeling.
Ping
De client kan een PingMessage naar de service verzenden om de Web PubSub-service in staat te stellen de liveness van de client te detecteren.
Antwoorden
Alle antwoordberichten voldoen aan de volgende protobuf-indeling:
message DownstreamMessage {
oneof message {
AckMessage ack_message = 1;
DataMessage data_message = 2;
SystemMessage system_message = 3;
PongMessage pong_message = 4;
}
message AckMessage {
uint64 ack_id = 1;
bool success = 2;
optional ErrorMessage error = 3;
message ErrorMessage {
string name = 1;
string message = 2;
}
}
message DataMessage {
string from = 1;
optional string group = 2;
MessageData data = 3;
}
message SystemMessage {
oneof message {
ConnectedMessage connected_message = 1;
DisconnectedMessage disconnected_message = 2;
}
message ConnectedMessage {
string connection_id = 1;
string user_id = 2;
}
message DisconnectedMessage {
string reason = 2;
}
}
message PongMessage {
}
}
Berichten die door de client worden ontvangen, kunnen zich in een van de volgende drie typen bevinden: ack, messageof systempong.
Ack-antwoord
Als de aanvraag bevat ackId, retourneert de service een ack-antwoord voor deze aanvraag. De client-implementatie moet dit ack-mechanisme verwerken, waaronder:
- Wachten op het ack-antwoord voor een
asyncawaitbewerking. - Er is een time-outcontrole wanneer het ack-antwoord gedurende een bepaalde periode niet wordt ontvangen.
De client-implementatie moet altijd eerst controleren om te zien of de success status is true of false. Wanneer de success status is false, kan de client lezen uit de error eigenschap voor foutdetails.
Berichtantwoord
Clients kunnen berichten ontvangen die zijn gepubliceerd vanuit een groep waaraan de client is toegevoegd. Of ze kunnen berichten ontvangen van de serverbeheerfunctie wanneer de server berichten naar een specifieke client of een specifieke gebruiker verzendt.
In de volgende scenario's krijgt u altijd een DownstreamMessage.DataMessage bericht:
- Wanneer het bericht afkomstig is van een groep,
fromisgroupdit . Wanneer het bericht afkomstig is van de server,fromisserverdit . - Wanneer het bericht afkomstig is van een groep,
groupis dit de groepsnaam.
De afzender dataType zorgt ervoor dat een van de volgende berichten wordt verzonden:
- Als
dataTypedat het istext, gebruiktmessage_response_message.data.text_datau . - Als
dataTypedat het isbinary, gebruiktmessage_response_message.data.binary_datau . - Als
dataTypedat het isprotobuf, gebruiktmessage_response_message.data.protobuf_datau . - Als
dataTypedat het isjson, gebruiktmessage_response_message.data.text_dataen de inhoud een geserialiseerde JSON-tekenreeks is.
Systeemantwoord
De Web PubSub-service kan ook systeemgerelateerde antwoorden naar de client verzenden.
Connected
Wanneer de client verbinding maakt met de service, ontvangt u een DownstreamMessage.SystemMessage.ConnectedMessage bericht.
Ontkoppeld
Wanneer de server de verbinding sluit of de service de client weigert, ontvangt u een DownstreamMessage.SystemMessage.DisconnectedMessage bericht.
Pong-antwoord
De Web PubSub-service verzendt een PongMessage naar de client wanneer deze een PingMessage van de client ontvangt.
Volgende stappen
Gebruik deze resources om te beginnen met het bouwen van uw eigen toepassing: