初めに

別スレッドでの会話を行う場合、認証トークンの再取得が必要ですが、DirectLine用の最初のトークンを引き回すと会話がリセットされるので、新規に認証トークンの生成が必要になります。

この操作もREST APIを呼び出します。

例のごとくSwaggerドキュメントは、ここ です。

APIの仕様

以下APIの仕様です

  • エンドポイント : https://directline.botframework.com/api/tokens/conversation
  • HTTPメソッド : POST
  • Header
    • Authorization
      • Key : BotConnector
      • Value : 認証トークン内のToken
  • Body : 空

レスポンス内容

レスポンス内容は、DirectLine用の新しい認証トークンがそのまま落ちてきます。

コード例

C#

C#だと以下のような感じです

        private static async Task StartNewConversation(string conversationId, string token)
        {
            var httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseUrl);
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", directLineAuthToken);

            var response = await httpClient.PostAsync("api/tokens/conversation", new FormUrlEncodedContent(new SortedDictionary()));
            var json = await response.Content.ReadAsStringAsync();

            return json.Replace('\\', ' ').Replace('"', ' ').Trim();
        }

Go

Goだと以下のような感じです

func StartNewConversation(token string, conversationID string) string {
    client := &http.Client{}
    values := url.Values{}
    
    req, _ := http.NewRequest("POST", "https://directline.botframework.com/api/tokens/conversation", strings.NewReader(values.Encode()))
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Content-length", "0")
    req.Header.Add("Authorization", "Botconnector DirectLineToken")
    res, _ := client.Do(req)
    body, _ := ioutil.ReadAll(res.Body)
    defer res.Body.Close()
    
    fmt.Println(string(body))
    return string(body)
}

まとめ

同時進行で別会話を実行する必要性がよくわからないですがこういうこともできるよっていうことで頭の片隅にあるといつかいいことがあるかもです。

CATEGORIES