HTTP protokolü ile Azure Web PubSub olay işleyicisi için CloudEvents uzantısı
Web PubSub hizmeti, CloudEvents HTTP protokol bağlamasını kullanarak istemci olaylarını yukarı akış web kancasına teslim eder.
Web PubSub hizmetinden sunucuya gönderilen veriler her zaman CloudEvents binary
biçimindedir.
- Web Kancası Doğrulaması
- Web PubSub CloudEvents Öznitelik Uzantısı
- Etkinlikler
- Olayları engelleme
- Olayların engelini kaldırma
Web kancası doğrulaması
Web kancası doğrulaması CloudEvents'i izler. İstek her zaman üst bilgide yer alır WebHook-Request-Origin: xxx.webpubsub.azure.com
.
Yalnızca teslim hedefi olayların teslimine izin verirse ve ise, üst bilgiyi ekleyerek WebHook-Allowed-Origin
isteği yanıtlamaSı GEREKİR, örneğin:
WebHook-Allowed-Origin: *
Veya:
WebHook-Allowed-Origin: xxx.webpubsub.azure.com
Şimdilik WebHook-Request-Rate ve WebHook-Request-Callback desteklenmez.
Web PubSub CloudEvents öznitelik uzantısı
Http belirtiminin artık uzantı HTTP üst bilgilerinin X- ön ekiyle önekli olmasını önermeyerek benzer bir desen izlediği de belirtildi.
Bu uzantı, Ürettiği her olay için Web PubSub tarafından kullanılan öznitelikleri tanımlar.
Özellikler
Adı | Tür | Açıklama | Örnek |
---|---|---|---|
userId |
string |
Bağlantının kimlik doğrulaması yapılan kullanıcı | |
hub |
string |
Bağlantının ait olduğu hub | |
connectionId |
string |
connectionId, istemci bağlantısı için benzersizdir | |
eventName |
string |
Ön ek olmadan olayın adı | |
subprotocol |
string |
varsa istemcinin kullandığı alt protokol | |
connectionState |
string |
Bağlantının durumunu tanımlar. Durumun değerini sıfırlamak için aynı yanıt üst bilgisini kullanabilirsiniz. Birden çok connectionState üst bilgi kullanılamaz. Örneğin, bu özniteliği kullanarak karmaşık bir nesne geçirmek için içinde karmaşık karakterler içeriyorsa, base64(jsonString) base64 dize değerini kodlayın. |
|
signature |
string |
Gelen isteğin beklenen kaynaktan olup olmadığını doğrulamak için yukarı akış web kancasının imzası. Hizmet, hem birincil erişim anahtarını hem de ikincil erişim anahtarını anahtar olarak HMAC kullanarak değeri hesaplar: Hex_encoded(HMAC_SHA256(accessKey, connectionId)) . Yukarı akış, işlemeden önce isteğin geçerli olup olmadığını denetlemelidir. |
Ekinlikler
İki tür olay vardır. Biri, hizmetin olayın yanıtının devam etmesi için beklediği olayları engelliyor . Bunlardan biri, hizmetin bir sonraki iletiyi işlemeden önce bu tür bir olayın yanıtını beklemediği olayların engelini kaldırmaktır.
- Olayları engelleme
- Olayların engelini kaldırma
Sistem connect
olayı
ce-type
:azure.webpubsub.sys.connect
Content-Type
:application/json
İstek biçimi:
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-----"
}
]
}
Başarılı yanıt biçimi:
Üst bilgi
ce-connectionState
: Bu üst bilgi varsa, bu bağlantının bağlantı durumu üst bilginin değerine güncelleştirilir. Bağlantı durumunu yalnızca engelleme olayları güncelleştirebilir. Aşağıdaki örnek, bağlantının karmaşık durumunu depolamak için base64 kodlanmış JSON dizesini kullanır.Durum kodu:
204
: İçerik olmadan başarı.200
: Başarılı, içerik aşağıdaki özelliklere izin verilen bir JSON biçimi olmalıdır:subprotocols
Olay,
connect
alt protokol ve kimlik doğrulama bilgilerini istemciden Yukarı Akış'a iletir. Web PubSub hizmeti, isteğin WebSocket protokolüne yükseltilip yükseltilmediğini belirlemek için durum kodunu kullanır.İstek özelliğini içeriyorsa
subprotocols
, sunucunun desteklediği bir altprotocol döndürmesi gerekir. Sunucu herhangi bir alt protokol kullanmak istemiyorsa, özelliği yanıt olarak göndermemelidirsubprotocol
. Boş üst bilgi göndermek geçersiz.userId
:{auth-ed user ID}
Hizmet anonim bağlantılara izin verdiğinden
connect
, hizmete istemci bağlantısının kullanıcı kimliğini bildirmek olayın sorumluluğundadır. Hizmet, varsa yanıt yükündenuserId
kullanıcı kimliğini okur. Kullanıcı kimliği istek taleplerinden veyaconnect
olayın yanıt yükünden okunamıyorsa bağlantı bırakılır.groups
:{groups to join}
özelliği, kullanıcının bu bağlantıyı bir veya birden çok gruba eklemesi için kullanışlı bir yol sağlar. Bu şekilde, bu bağlantıyı bir gruba eklemek için başka bir çağrıya gerek yoktur.
roles
:{roles the client has}
özelliği, yukarı akış Web kancasının istemciyi yetkilendirmesi için bir yol sağlar. PubSub WebSocket istemcileri için ilk izinleri vermek için farklı roller vardır. İzinlerle ilgili ayrıntılar İstemci izinleri bölümünde açıklanmıştır.
HTTP/1.1 200 OK
ce-connectionState: eyJrZXkiOiJhIn0=
{
"groups": [],
"userId": "",
"roles": [],
"subprotocol": ""
}
Hata yanıtı biçimi:
4xx
: Hata, yukarı akıştan gelen yanıt, istemci isteği için yanıt olarak döndürülür.
HTTP/1.1 401 Unauthorized
Sistem connected
olayı
İstemci WebSocket el sıkışmasını tamamladığında ve başarıyla bağlandığında hizmet Yukarı Akışı çağırır.
ce-type
:azure.webpubsub.sys.connected
Content-Type
:application/json
ce-connectionState
:eyJrZXkiOiJhIn0=
İstek gövdesi boş JSON.
İstek biçimi:
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=
{}
Yanıt biçimi:
2xx
: başarı yanıtı.
connected
zaman uyumsuz bir olaydır, yanıt durum kodu başarılı olmadığında hizmet bir hata kaydeder.
HTTP/1.1 200 OK
Sistem disconnected
olayı
disconnected
bağlantı olayı durum kodu döndürürse 2xx
istemci isteği tamamlandığında olay her zaman tetikler.
ce-type
:azure.webpubsub.sys.disconnected
Content-Type
:application/json
İstek biçimi:
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
,
reason
istemcinin bağlantısını kesme nedenini açıklar.
Yanıt biçimi:
2xx
: başarı yanıtı.
disconnected
zaman uyumsuz bir olaydır, yanıt durum kodu başarılı olmadığında hizmet bir hata kaydeder.
HTTP/1.1 200 OK
Basit WebSocket istemcileri için kullanıcı olayı message
Hizmet, her WebSocket ileti çerçevesi için olay işleyici yukarı akışını çağırır.
ce-type
:azure.webpubsub.user.message
Content-Type
:application/octet-stream
ikili çerçeve için;text/plain
metin çerçevesi için;
İstemcinin gönderdiği UserPayload değeridir.
İstek biçimi:
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
Başarılı yanıt biçimi
- Durum kodu
204
: İçerik olmadan başarı.200
: Başarı, biçimiUserResponsePayload
yanıtın biçimineContent-Type
bağlıdır.
Content-Type
:application/octet-stream
ikili çerçeve için;text/plain
metin çerçevesi için;- Üst bilgi
Content-Type
:application/octet-stream
ikili çerçeve için;text/plain
metin çerçevesi için; - Üst bilgi
ce-connectionState
: Bu üst bilgi varsa, bu bağlantının bağlantı durumu üst bilginin değerine güncelleştirilir. Bağlantı durumunu yalnızca engelleme olayları güncelleştirebilir. Aşağıdaki örnek, bağlantının karmaşık durumunu depolamak için base64 kodlanmış JSON dizesini kullanır.
Content-Type
olduğundaapplication/octet-stream
, hizmet WebSocket çerçevesini kullanarak binary
istemciye gönderirUserResponsePayload
. Content-Type
olduğundatext/plain
, hizmet WebSocket çerçevesini kullanarak text
istemciye gönderirUserResponsePayload
.
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
Hata yanıtı biçimi
Durum kodu başarılı olmadığında hata yanıtı olarak kabul edilir. Yanıt durum kodu başarılı olmazsa message
bağlantı bırakılır.
PubSub WebSocket istemcileri için kullanıcı özel olayı {custom_event}
Hizmet, geçerli her özel olay iletisi için olay işleyici web kancasını çağırır.
Olay 1: metin verileriyle olay gönderme:
{
"type": "event",
"event": "<event_name>",
"dataType" : "text",
"data": "text data"
}
Yukarı akış olay işleyicisinin aşağıdaki gibi aldığı şey, Content-Type
CloudEvents HTTP isteği text/plain
için 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
Olay 2: JSON verileriyle olay gönderme:
{
"type": "event",
"event": "<event_name>",
"dataType" : "json",
"data": {
"hello": "world"
},
}
Yukarı akış olay işleyicisinin aşağıdaki gibi aldığı şey, Content-Type
CloudEvents HTTP isteği application/json
için 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"
}
Olay 3: ikili verilerle olay gönderme:
{
"type": "event",
"event": "<event_name>",
"dataType" : "binary",
"data": "aGVsbG8gd29ybGQ=" // base64 encoded binary
}
Yukarı akış olay işleyicisinin aşağıdaki gibi aldığı şey, Content-Type
CloudEvents HTTP isteği application/octet-stream
için 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>
Başarılı yanıt biçimi
HTTP/1.1 200 OK
Content-Type: application/octet-stream | text/plain | application/json
Content-Length: nnnn
UserResponsePayload
- Durum kodu
204
: İçerik olmadan başarı.200
: Başarılı, PubSub WebSocket istemcisineContent-Type
veri gönderme;
- Üst bilgi
ce-connectionState
: Bu üst bilgi varsa, bu bağlantının bağlantı durumu üst bilginin değerine güncelleştirilir. Bağlantı durumunu yalnızca engelleme olayları güncelleştirebilir. Aşağıdaki örnek, bağlantının karmaşık durumunu depolamak için base64 kodlanmış JSON dizesini kullanır. - Üst bilgi
Content-Type
olduğundaapplication/octet-stream
hizmet, base64 kodlanmış yük ile olduğu gibibinary
kullanarakdataType
istemciye geri gönderirUserResponsePayload
. Örnek yanıt:{ "type": "message", "from": "server", "dataType": "binary", "data" : "aGVsbG8gd29ybGQ=" }
Content-Type
olduğundatext/plain
, hizmet yük dizesinde olduğu gibitext
kullanarakdataType
istemciye gönderirUserResponsePayload
.Content-Type
olduğundaapplication/json
, hizmet yanıt yükü gövdesi olarak değer belirteci ile kullanarakdataType
data
json
=istemciye gönderir.UserResponsePayload
Hata yanıtı biçimi
Durum kodu başarılı olmadığında hata yanıtı olarak kabul edilir. Yanıt durum kodu başarılı olmazsa {custom_event}
bağlantı bırakılır.
Sonraki adımlar
Kendi uygulamanızı oluşturmaya başlamak için şu kaynakları kullanın: