前回REST APIで会話を開始する(認証)部分について触れたので、次に実際に会話する部分の実装をしてみます。
初めに
例のごとくSwaggerドキュメントは、ここ です。
認証トークンについては、前回の記事 を参照して取得しておいてください
APIの仕様
以下APIの仕様です。
- エンドポイント : https://directline.botframework.com/api/conversations/{ConversationId}/messages
- conversationId : 前回取得したトークン内のConversationId
- HTTPメソッド : POST
- Content-type : application/json
- Header
- Body : Json形式(以下参照)
Body用のJson形式
{ "id": "string", "conversationId": "string", "created": "datetime", "from": "string", "text": "string", "channelData": "string", "images": [ "string" ], "attachments": [ { "url": "string", "contentType": "string" } ], "eTag": "string" }
textだけデータを入れておけば問題なく受け付けてくれます。
レスポンス内容
このAPIは、受け付けると空の204が返ってきます。
その他は, Swaggerドキュメント参照
コード例
C#
C#だと大体以下のような感じ
モデルは、面倒だったのでライブラリで用意されているものを使用していますが他は、HttpClientをベースに作っています。
private static async Task Send(AuthTokenModel token) { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json; charset=utf-8")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", token.Token); httpClient.BaseAddress = new Uri(baseUrl); var message = new Microsoft.Bot.Connector.DirectLine.Models.Message { Text = "hogehoge" }; var json = JsonConvert.SerializeObject(message); var response = await httpClient.PostAsJsonAsync("api/conversations/" + token.ConversationId + "/messages", message); }
Go
Goだと大体以下のような感じ
type Token struct { ConversationId string ETag string Token string } type Message struct { Id string `json:"id"` ConversationId string `json:"conversationId"` Created string `json:"created"` From string `json:"from"` Text string `json:"text"` ChannelData string `json:"channelData"` Images [] string `json:"images"` Attachments [] Attachment `json:"attachments"` ETag string `json:"eTag"` } type Attachment struct { Url string `json:"url"` ContentType string `json:"contentType"` }
次に送信処理です。
引数には、前回取得したTokenとConversationIdを渡します
func SendMessage(token string, conversationID string){ message := Message{} message.Text = "hogehoge" json, err := json.Marshal(message) if err != nil{ return } req, err := http.NewRequest("POST", "https://directline.botframework.com/api/conversations/" + conversationID + "/messages", bytes.NewBuffer([]byte(json))) if err != nil{ return } req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Botconnector " + token) client := &http.Client{} resp, _ := client.Do(req) fmt.Println(resp.Status) }
まとめ
基本的にゆるりとエンドポイントにPOSTすればメッセージの送信はできます。
あとは、やりとりを取得する処理を作ればBotとの会話が可能になるのでそれはまた次回