REST APIでBotと会話する(会話開始編)
DirectLineを使ってのBotとのやり取りを以前まとめましたが、今回はそれをラッパーライブラリなしでやってみます。
初めに
今回の内容は、DirectLineの認証トークンを取得するまでを行います。
ちなみにDirectLine全体のSwaggerドキュメントは、ここ にあります。
APIの仕様
認証トークンの取得用のREST APIの使い方は、以下のような感じです。
- エンドポイント : https://directline.botframework.com/api/conversations
- HTTPメソッド : POST
- content-type : application/json
- header
- Body : 空
大体こんな感じです。
レスポンス内容
以下のような感じです。
Swaggerには、eTag要素が含まれていますが落ちてこないので謎です。
{
"conversationId": "string",
"token": "string"
}
コード例
C#
C#だと大体以下のような感じで取得できます。
まずレスポンスを格納するモデルです。
class AuthTokenModel
{
[JsonProperty("conversationId")]
public string ConversationId { get; set; }
[JsonProperty("token")]
public string Token { get; set; }
[JsonProperty("eTag")]
public string ETag { get; set; }
}
実際に取得するコード
private static async TaskGetDirectLineAuthToken() { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", "DirectLineToken"); httpClient.BaseAddress = new Uri("https://directline.botframework.com/"); var response = await httpClient.PostAsync("api/conversations", new FormUrlEncodedContent(new SortedDictionary ())); var json = await response.Content.ReadAsStringAsync(); var authTokenModel = JsonConvert.DeserializeObject (json); return authTokenModel; }
Curl
Curlで呼び出すと以下のような感じです。
curl -H "Authorization: BotConnector Token" \ -X POST \ -H "Content-type: application/json" \ -H "Content-length: 0" \ https://directline.botframework.com/api/conversations
Go言語
Goでやると以下のような感じ
まずレスポンスを格納する構造体です。
type Token struct {
ConversationId string
ETag string
Token string
}
全体のコードは、以下のような感じ
DirectLineTokenのところにBot Frameworkのサイトから取得できるトークンを入れます
package main
import(
"fmt"
"net/http"
"net/url"
"strings"
"io/ioutil"
"encoding/json"
)
type Token struct {
ConversationId string
ETag string
Token string
}
func main(){
values := url.Values{}
req, err := http.NewRequest("POST", "https://directline.botframework.com/api/conversations", strings.NewReader(values.Encode()))
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Content-length", "0")
req.Header.Add("Authorization", "Botconnector DirectLineToken")
if err != nil{
fmt.Println("erro1")
return
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil{
return
}
defer resp.Body.Close()
token, err := ParseJson(resp)
if err != nil{
return
}
fmt.Println(token.Token)
fmt.Println(token.ConversationId)
}
func ParseJson(resp *http.Response) (Token, error){
b, err := ioutil.ReadAll(resp.Body)
var token Token
json.Unmarshal(b, &token)
return token, err
}
まとめ
認証トークンが取れたらあとはBotにメッセージを投げて、メッセージの取得の繰り返しです。
そこら辺の処理についてはまた今度
DirectLineならSDKやらがない言語でも単純なHTTPのやり取りで会話できるのでGoとかJavaとかでやりたかったらこれを使う方向で行きましょう