Rozšíření CloudEvents pro obslužnou rutinu události Azure Web PubSub s protokolem HTTP
Služba Web PubSub doručuje události klienta do upstreamového webhooku pomocí vazby protokolu HTTP CloudEvents.
Data odeslaná ze služby Web PubSub na server jsou vždy ve formátu CloudEvents binary
.
- Ověření webhooku
- Rozšíření atributů Web PubSub CloudEvents
- Události
- Blokování událostí
- Odblokování událostí
Ověření webhooku
Ověření webhooku se řídí CloudEvents. Požadavek vždy obsahuje WebHook-Request-Origin: xxx.webpubsub.azure.com
v hlavičce.
Pokud cíl doručení povoluje doručení událostí, musí odpovědět na požadavek zahrnutím WebHook-Allowed-Origin
hlavičky, například:
WebHook-Allowed-Origin: *
Nebo:
WebHook-Allowed-Origin: xxx.webpubsub.azure.com
Prozatím se nepodporuje funkce WebHook-Request-Rate a WebHook-Request-Callback.
Rozšíření atributů Web PubSub CloudEvents
Také jsme si poznamenali, že specifikace HTTP nyní sleduje podobný vzor tím, že už nenavrhuje, aby hlavičky HTTP rozšíření byly předpony X-.
Toto rozšíření definuje atributy používané web pubSub pro každou událost, kterou vytvoří.
Atributy
Name | Typ | Popis | Příklad |
---|---|---|---|
userId |
string |
Uživatel, který připojení autoroval | |
hub |
string |
Centrum, do které připojení patří | |
connectionId |
string |
ID připojení je jedinečné pro připojení klienta. | |
eventName |
string |
Název události bez předpony | |
subprotocol |
string |
Dílčí souhrn, který klient používá, pokud existuje | |
connectionState |
string |
Definuje stav připojení. Stejnou hlavičku odpovědi můžete použít k resetování hodnoty stavu. Více connectionState záhlaví není povoleno. Do base64 kódovat řetězcovou hodnotu, pokud obsahuje složité znaky uvnitř, base64(jsonString) například předat komplexní objekt pomocí tohoto atributu. |
|
signature |
string |
Podpis upstreamového webhooku, který ověří, jestli příchozí požadavek pochází z očekávaného původu. Služba vypočítá hodnotu pomocí primárního přístupového klíče i sekundárního přístupového HMAC klíče jako klíče: Hex_encoded(HMAC_SHA256(accessKey, connectionId)) . Upstream by měl před zpracováním zkontrolovat, jestli je požadavek platný. |
Událost
Existují dva typy událostí. Jedna blokuje události, které služba čeká na pokračování odpovědi události. Jedním z nich je odblokování událostí, které služba nečeká na odpověď takové události před zpracováním další zprávy.
- Blokování událostí
- Odblokování událostí
Systémová connect
událost
ce-type
:azure.webpubsub.sys.connect
Content-Type
:application/json
Formát požadavku:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.connect
ce-source: /hubs/{hub}/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}
ce-eventName: connect
{
"claims": {},
"query": {},
"headers": {},
"subprotocols": [],
"clientCertificates": [
{
"thumbprint": "<certificate SHA-1 thumbprint>",
"content": "-----BEGIN CERTIFICATE-----\r\n...\r\n-----END CERTIFICATE-----"
}
]
}
Formát odpovědi na úspěch:
Hlavička
ce-connectionState
: Pokud tato hlavička existuje, stav připojení tohoto připojení se aktualizuje na hodnotu hlavičky. Stav připojení může aktualizovat pouze blokující události. Následující ukázka používá řetězec JSON kódovaný v base64 k uložení komplexního stavu připojení.Stavový kód:
204
: Úspěch bez obsahu.200
: Úspěch, obsah by měl být formát JSON s následujícími povolenými vlastnostmi:subprotocols
Událost
connect
předá subprotocol a ověřovací informace do upstreamu z klienta. Služba Web PubSub používá stavový kód k určení, jestli se požadavek upgraduje na protokol WebSocket.Pokud požadavek obsahuje
subprotocols
vlastnost, měl by server vrátit jeden dílčí souhrn, který podporuje. Pokud server nechce používat žádné dílčí souhrny, nemělsubprotocol
by odeslat vlastnost v odpovědi. Odeslání prázdné hlavičky je neplatné.userId
:{auth-ed user ID}
Protože služba umožňuje anonymní připojení, je
connect
zodpovědností události informovat službu o ID uživatele připojení klienta. Pokud existuje, služba načte ID uživatele z datové částiuserId
odpovědi. Připojení se zahodí, pokud ID uživatele nelze číst z deklarací identity požadavku aniconnect
datové části odpovědi události.groups
:{groups to join}
Vlastnost poskytuje pohodlný způsob, jak uživatel přidat toto připojení k jedné nebo více skupinám. Tímto způsobem není potřeba mít další volání pro přidání tohoto připojení do určité skupiny.
roles
:{roles the client has}
Vlastnost poskytuje způsob, jak upstream Webhook autorizovat klienta. Existují různé role k udělení počátečních oprávnění pro klienty PubSub WebSocket. Podrobnosti o oprávněních jsou popsány v oprávněních klienta.
HTTP/1.1 200 OK
ce-connectionState: eyJrZXkiOiJhIn0=
{
"groups": [],
"userId": "",
"roles": [],
"subprotocol": ""
}
Formát odpovědi na chybu:
4xx
: Chyba, odpověď z upstreamu bude vrácena jako odpověď pro požadavek klienta.
HTTP/1.1 401 Unauthorized
Systémová connected
událost
Služba volá upstream, když klient dokončí metodu handshake protokolu WebSocket a úspěšně se připojí.
ce-type
:azure.webpubsub.sys.connected
Content-Type
:application/json
ce-connectionState
:eyJrZXkiOiJhIn0=
Text požadavku je prázdný JSON.
Formát požadavku:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.connected
ce-source: /hubs/{hub}/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}
ce-eventName: connected
ce-subprotocol: abc
ce-connectionState: eyJrZXkiOiJhIn0=
{}
Formát odpovědi:
2xx
: odpověď na úspěch.
connected
je asynchronní událost, pokud stavový kód odpovědi není úspěšný, služba zaznamená chybu.
HTTP/1.1 200 OK
Systémová disconnected
událost
disconnected
událost se vždy aktivuje, když se požadavek klienta dokončí, pokud událost připojení vrátí 2xx
stavový kód.
ce-type
:azure.webpubsub.sys.disconnected
Content-Type
:application/json
Formát požadavku:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.disconnected
ce-source: /hubs/{hub}/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}
ce-eventName: disconnected
ce-subprotocol: abc
ce-connectionState: eyJrZXkiOiJhIn0=
{
"reason": "{Reason}"
}
reason
Popisuje
reason
důvod, proč se klient odpojí.
Formát odpovědi:
2xx
: odpověď na úspěch.
disconnected
je asynchronní událost, pokud stavový kód odpovědi není úspěšný, služba zaznamená chybu.
HTTP/1.1 200 OK
Událost message
uživatele pro jednoduché klienty WebSocket
Služba vyvolá upstream obslužné rutiny události pro každý rámec zprávy WebSocket.
ce-type
:azure.webpubsub.user.message
Content-Type
:application/octet-stream
pro binární rámec;text/plain
pro textový rámec;
UserPayload je to, co klient odesílá.
Formát požadavku:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/octet-stream | text/plain | application/json
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.message
ce-source: /hubs/{hub}/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}
ce-eventName: message
ce-connectionState: eyJrZXkiOiJhIn0=
UserPayload
Formát odpovědi na úspěch
- Stavový kód
204
: Úspěch bez obsahu.200
: Úspěch, formát odpovědiUserResponsePayload
závisí naContent-Type
odpovědi.
Content-Type
:application/octet-stream
pro binární rámec;text/plain
pro textový rámec;- Hlavička
Content-Type
:application/octet-stream
pro binární rámeček;text/plain
pro textový rámeček; - Hlavička
ce-connectionState
: Pokud tato hlavička existuje, stav připojení tohoto připojení se aktualizuje na hodnotu hlavičky. Stav připojení může aktualizovat pouze blokující události. Následující ukázka používá řetězec JSON kódovaný v base64 k uložení složitého stavu připojení.
Pokud je application/octet-stream
, Content-Type
služba odešle UserResponsePayload
klientovi pomocí binary
rámce WebSocket. Pokud je text/plain
, Content-Type
služba odešle UserResponsePayload
klientovi pomocí text
rámce WebSocket.
HTTP/1.1 200 OK
Content-Type: application/octet-stream (for binary frame) or text/plain (for text frame)
Content-Length: nnnn
ce-connectionState: eyJrZXkiOiJhIn0=
UserResponsePayload
Formát odpovědi na chybu
Pokud stavový kód není úspěšný, považuje se za chybovou odpověď. Pokud stavový kód odpovědi nebude úspěšný, připojení se zahodímessage
.
Vlastní událost {custom_event}
uživatele pro klienty PubSub WebSocket
Služba volá webhook obslužné rutiny události pro každou platnou vlastní zprávu události.
Případ 1: Odeslání události s textovými daty:
{
"type": "event",
"event": "<event_name>",
"dataType" : "text",
"data": "text data"
}
Co obslužná rutina upstreamové události přijímá jako v následujícím příkladu Content-Type
, pro požadavek HTTP CloudEvents je text/plain
určený dataType
=text
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>
ce-subprotocol: json.webpubsub.azure.v1
ce-connectionState: eyJrZXkiOiJhIn0=
text data
Případ 2: Odeslání události s daty JSON:
{
"type": "event",
"event": "<event_name>",
"dataType" : "json",
"data": {
"hello": "world"
},
}
Co obslužná rutina upstreamové události přijímá jako v následujícím příkladu Content-Type
, pro požadavek HTTP CloudEvents je application/json
určený dataType
=json
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>
ce-subprotocol: json.webpubsub.azure.v1
ce-connectionState: eyJrZXkiOiJhIn0=
{
"hello": "world"
}
Případ 3: Odeslání události s binárními daty:
{
"type": "event",
"event": "<event_name>",
"dataType" : "binary",
"data": "aGVsbG8gd29ybGQ=" // base64 encoded binary
}
Co obslužná rutina upstreamové události přijímá jako v následujícím příkladu Content-Type
, pro požadavek HTTP CloudEvents je application/octet-stream
určený dataType
=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>
ce-subprotocol: json.webpubsub.azure.v1
<binary data>
Formát odpovědi na úspěch
HTTP/1.1 200 OK
Content-Type: application/octet-stream | text/plain | application/json
Content-Length: nnnn
UserResponsePayload
- Stavový kód
204
: Úspěch bez obsahu.200
: Úspěch, odesílání dat do klienta PubSub WebSocket závisí naContent-Type
;
- Hlavička
ce-connectionState
: Pokud tato hlavička existuje, stav připojení tohoto připojení se aktualizuje na hodnotu hlavičky. Stav připojení může aktualizovat pouze blokující události. Následující ukázka používá řetězec JSON kódovaný v base64 k uložení komplexního stavu připojení. - Pokud je hlavička
Content-Type
, služba odešleUserResponsePayload
zpět klientovi, který používádataType
jakobinary
s kódováním base64 datovéapplication/octet-stream
části. Ukázková odpověď:{ "type": "message", "from": "server", "dataType": "binary", "data" : "aGVsbG8gd29ybGQ=" }
- Pokud je
text/plain
tomu takContent-Type
, služba odešleUserResponsePayload
klientovi jakodataType
text
s řetězcem datové části. - Pokud je
application/json
,Content-Type
služba odešleUserResponsePayload
klientovi pomocídataType
=json
tokenudata
hodnoty jako tělo datové části odpovědi.
Formát odpovědi na chybu
Pokud stavový kód není úspěšný, považuje se za chybovou odpověď. Pokud stavový kód odpovědi nebude úspěšný, připojení se zahodí{custom_event}
.
Další kroky
Pomocí těchto prostředků můžete začít vytvářet vlastní aplikaci: