Příjem aktivit od robota v rozhraní API Direct Line 3.0
Pomocí protokolu Direct Line 3.0 můžou klienti přijímat aktivity prostřednictvím WebSocket
streamu nebo načítat aktivity vydáváním HTTP GET
požadavků.
WebSocket vs. HTTP GET
Streamovací protokol WebSocket efektivně odesílá zprávy klientům, zatímco rozhraní GET umožňuje klientům explicitně vyžadovat zprávy. I když je mechanismus WebSocket často preferován kvůli své účinnosti, může být mechanismus GET užitečný pro klienty, kteří nemohou používat protokol WebSocket.
Služba umožňuje pouze 1 připojení WebSocket na konverzaci. Direct Line může ukončit další připojení WebSocket s hodnotou collision
důvodu .
Ne všechny typy aktivit jsou k dispozici prostřednictvím protokolu WebSocket i prostřednictvím http GET. Následující tabulka popisuje dostupnost různých typů aktivit pro klienty, kteří používají protokol Direct Line.
Typ aktivity | Dostupnost |
---|---|
zpráva | HTTP GET a WebSocket |
Psaní | Pouze protokol WebSocket |
conversationUpdate | Neodeslané nebo přijaté prostřednictvím klienta |
contactRelationUpdate | Nepodporuje se v Direct Line |
endOfConversation | HTTP GET a WebSocket |
všechny ostatní typy aktivit | HTTP GET a WebSocket |
Příjem aktivit prostřednictvím streamu WebSocket
Když klient odešle žádost o zahájení konverzace k otevření konverzace s robotem, odpověď služby obsahuje streamUrl
vlastnost, kterou může klient následně použít k připojení prostřednictvím protokolu WebSocket. Adresa URL streamu je předem autorizována, a proto požadavek klienta na připojení prostřednictvím protokolu WebSocket NEVYŽADUJE hlavičku Authorization
.
Následující příklad ukazuje požadavek, který používá streamUrl
k připojení přes WebSocket.
-- connect to wss://directline.botframework.com --
GET /v3/directline/conversations/abc123/stream?t=RCurR_XV9ZA.cwA..."
Upgrade: websocket
Connection: upgrade
[other headers]
Služba odpoví stavovým kódem HTTP 101 ("Přepínání protokolů").
HTTP/1.1 101 Switching Protocols
[other headers]
Příjem zpráv
Po připojení přes protokol WebSocket může klient obdržet z Direct Line služby tyto typy zpráv:
- Zpráva obsahující sadu aktivit obsahující jednu nebo více aktivit a vodoznak (popsaný níže).
- Prázdná zpráva, kterou služba Direct Line používá k zajištění platnosti připojení.
- Další typy, které budou definovány později. Tyto typy jsou identifikované vlastnostmi v kořenovém adresáři JSON.
Obsahuje ActivitySet
zprávy odeslané robotem a všemi uživateli v konverzaci. Následující příklad ukazuje, ActivitySet
že obsahuje jednu zprávu.
{
"activities": [
{
"type": "message",
"channelId": "directline",
"conversation": {
"id": "abc123"
},
"id": "abc123|0000",
"from": {
"id": "user1"
},
"text": "hello"
}
],
"watermark": "0000a-42"
}
Zpracování zpráv
Klient by měl sledovat watermark
hodnotu, kterou obdrží v každé sadě aktivit, aby mohl pomocí vodoznaku zaručit, že se žádné zprávy neztratí, pokud ztratí připojení a potřebuje se znovu připojit ke konverzaci. Pokud klient obdrží ActivitySet
hodnotu , kde watermark
vlastnost je null
nebo chybí, měl by tuto hodnotu ignorovat a nepřepsat předchozí vodoznak, který obdržel.
Klient by měl ignorovat prázdné zprávy, které obdrží ze služby Direct Line.
Klient může odesílat prázdné zprávy službě Direct Line za účelem ověření připojení. Služba Direct Line bude ignorovat prázdné zprávy, které obdrží od klienta.
Služba Direct Line může za určitých podmínek vynutit ukončení připojení WebSocket. Pokud klient neobdržel endOfConversation
aktivitu, může vygenerovat novou adresu URL streamu Protokolu WebSocket , kterou může použít k opětovnému připojení ke konverzaci.
Datový proud Protokolu WebSocket obsahuje živé aktualizace a velmi nedávné zprávy (protože bylo vydáno volání pro připojení prostřednictvím protokolu WebSocket), ale neobsahuje zprávy odeslané před nejnovější POST
zprávou do /v3/directline/conversations/{id}
. Pokud chcete načíst zprávy odeslané dříve v konverzaci, použijte následující HTTP GET
postup.
Načtení aktivit pomocí HTTP GET
Klienti, kteří nemůžou používat protokol WebSocket, můžou načíst aktivity pomocí .HTTP GET
Pokud chcete načíst zprávy pro určitou konverzaci, zadejte GET
požadavek na /v3/directline/conversations/{conversationId}/activities
koncový bod a volitelně zadejte watermark
parametr, který označuje poslední zprávu zobrazenou klientem.
Následující fragmenty kódu poskytují příklad požadavku a odpovědi na získání aktivit konverzace. Odpověď Získat aktivity konverzace obsahuje watermark
jako vlastnost ActivitySet. Klienti by měli procházet dostupné aktivity posouváním hodnoty, watermark
dokud se nevrátí žádné aktivity.
Žádost
GET https://directline.botframework.com/v3/directline/conversations/abc123/activities?watermark=0001a-94
Authorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0
Odpověď
HTTP/1.1 200 OK
[other headers]
{
"activities": [
{
"type": "message",
"channelId": "directline",
"conversation": {
"id": "abc123"
},
"id": "abc123|0000",
"from": {
"id": "user1"
},
"text": "hello"
},
{
"type": "message",
"channelId": "directline",
"conversation": {
"id": "abc123"
},
"id": "abc123|0001",
"from": {
"id": "bot1"
},
"text": "Nice to see you, user1!"
}
],
"watermark": "0001a-95"
}
Důležité informace o načasování
Většina klientů si přeje zachovat úplnou historii zpráv. I když je Direct Line vícedílný protokol s možnými časovacími mezerami, protokol a služba jsou navržené tak, aby usnadnily vytvoření spolehlivého klienta.
Vlastnost odeslaná
watermark
v datovém proudu WebSocket a odpovědi Získat aktivity konverzace je spolehlivá. Klientovi neuniknou žádné zprávy, pokud přehraje doslovné znění vodoznaku.Když klient zahájí konverzaci a připojí se ke streamu WebSocket, všechny aktivity odeslané po post, ale před otevřením soketu se přehrají před novými aktivitami.
Když klient během připojení k datovému proudu WebSocket vydá žádost o získání aktivit konverzací (kvůli aktualizaci historie), můžou se aktivity duplikovat v obou kanálech. Klienti by měli sledovat všechna známá ID aktivit, aby v případě výskytu duplicitních aktivit mohli odmítnout.
Klienti, kteří používají HTTP GET
dotazování, by měli zvolit interval dotazování, který odpovídá jejich zamýšlenému použití.
Aplikace mezi službami často používají interval dotazování 5 nebo 10 s.
Klientské aplikace často používají interval dotazování 1s a krátce po každé zprávě odesílané klientem zasílají jeden další požadavek (za účelem rychlého načtení odpovědi robota). Tato prodleva může být krátká na 300 ms, ale měla by se vyladit na základě rychlosti robota a doby přepravy. Cyklické dotazování by nemělo být po delší časové období častější než jednou za sekundu.