簡単なチャットボットを作ってみよう（バックエンド編）

船井総研デジタルのtakizawaです。
今回は [こちらの記事](https://qiita.com/fsd-takizawa/items/c71695380b0b9e9ef0b8) の続編になります。
前回準備したバックエンドプロジェクトを実装していきます。なおAzure Open AIとの連携はフロントエンドまで実装が終わってから実装する予定です。

# バックエンドの処理フロー

まだAzureOpenAIへの連携を実装しないので、今は単純に受け取った文字列をすこしだけ加工して戻すように実装します。単純ですがフローをは次のようになります。

![スクリーンショット 2023-08-22 100501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/34607ff6-ec9e-b3f4-e389-f77810280b90.png)

今回ASP.NETのWebAPIで実装し、JSON形式でフロントエンドとデータのやり取りを行う想定です。

# Modelの作成

まずデータをやり取りするための入れ物であるモデルを作成します。ここではdotnetプロジェクト直下に作成します。

* データ受信用モデル
    ```csharp:ReceiveMessage.cs
    namespace test_bot_back;
    public class ReceiveMessage
    {
        public required string Message { get; set;}
    }
    ```

    ここで受け取るMessageは必ず設定されてくる想定なので```required```を付与しています。

* データ送信用モデル

    ```csharp:ReplyMessage.cs
    namespace test_bot_back;
    
    public class ReplyMessage
    {
        public required string Reply { get; set; }
        public required string[] SendMessages { get; set; }
    }
    ```

    データ送信用モデルについても各フィールドに何かしらの値を設定する想定なので各フィールドに```required```を付与しています。

# Controllerの作成

dotnetプロジェクトに```Controller```フォルダが存在しているはずですので、そこにコントローラーを作成します。まずはコード全体を示します。

```csharp:ReplyController.cs
using Microsoft.AspNetCore.Mvc;

namespace test_bot_back.Controllers;

[ApiController]
[Route("api/[controller]")]
public class ReplyController : ControllerBase
{
    private readonly ILogger<ReplyController> _logger;

    public ReplyController(ILogger<ReplyController> logger)
    {
        _logger = logger;
    }

    [HttpPost]
    public IEnumerable<ReplyMessage> Get(ReceiveMessage receive)
    {
        ReplyMessage reply = new ReplyMessage
        {
            SendMessages = new string[] { receive.Message },
            Reply = $"{receive.Message}の返答",
        };

        Thread.Sleep(1000);
        return new ReplyMessage[] { reply };
    }
}
```

ポイントを絞って解説していきます。

1. クラスは```ControllerBase```を継承します。
1. クラスに属性```[ApiController]```を付与します。
    これは「Web API のビルドを簡単にする厳格な動作を有効」にします。詳しくは [ASP.NET Core を使って Web API を作成する](https://learn.microsoft.com/ja-jp/aspnet/core/web-api/?view=aspnetcore-7.0#apicontroller-attribute-1) を参照してください。

1. クラスに属性```[Route("api/[controller]")]```を付与します。
    このRoute属性はWebAPIを呼び出すURLを指定します。ここで```[controller]```トークンはコントローラクラス名から「Controller」サフィックスを除いた文字列に置き換えられます。この例では```[controller] = Reply```となります。
したがって開発環境でこのコントローラーを呼び出す完全なURLは```https://localhost:{PORT}/api/Reply```となります。

1. フロントエンドから呼び出すメソッドにCRUD操作(GET、PUT、POST、DELETE) に対応する属性を付与します。
    ここではオブジェクトをJSONで連携しオブジェクトを返却するので```POST```に対応する```[HttpPost]```を付与しています。

WebAPIに関する説明は以上ですがメソッドの処理についても軽く触れておこうと思います。
このメソッドでは受け取ったメッセージを使って返却するオブジェクトを作成しています。その後、1秒間処理を一時停止したのちオブジェクトを返却しています。このスリープ処理はフロントエンドの動作を確認するために加えており、最終的には削除する予定です。

ここまで出来たらもともと```Controller```フォルダ内に存在していたサンプルのコントローラークラスは削除してもらって大丈夫です。またそのコントローラーのみで使用しているモデルクラスも削除できます。もちろん削除しなくても動作に支障はありません。

# ローカルで動かしてみる

Visual Studio Codeのターミナルを開きdotnetプロジェクトに移動します。（```cd <プロジェクトフォルダ名>```）その後に次のコマンドで起動します。

```bash
dotnet run --launch-profile https
```

起動したらswaggerを立ち上げます。ウェブブラウザで次のURLに接続してください。

```
https://localhost:7294/swagger/index.html
```

※ポート（ここでは7294）はコンソールに出力されたものに書き換えて下さい。

すると次のような画面が表示されます。

![スクリーンショット 2023-08-22 111426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/15423375-1461-9b6a-b69b-8f95c654c439.png)

次に薄い緑色の```POST```を囲んでいるエリアをクリックします。

![スクリーンショット 2023-08-22 111801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/340591ec-3c54-b9de-4592-527f2edabe98.png)

続いて```Try it out```ボタンをクリックします。

![スクリーンショット 2023-08-22 111927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/0e7e98d3-6a0e-8a7b-420f-4ffa8f375ce3.png)

赤枠のstringの文字列を任意の文字に書き換えます。ここでは```ハローチャットボット```で書き換えてみます。

![スクリーンショット 2023-08-22 112543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/1a41dec0-fb1e-f8d9-b823-a711a7663418.png)

その後```Execute```ボタンをクリックします。

![スクリーンショット 2023-08-22 112822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473569/d4d6ae90-1f13-1a6e-6fad-776c330b9899.png)

```reply```フィールドに加工された文字列が、```sendMessages```フィールドに送信した文字列が設定されていれば成功です。

# まとめ

今回はASP.NETのWebAPIでバックエンドを実装しました。次回はVue.jsとTypeScriptでフロントエンドを実装していきます。

続編の記事を投稿しました！
[簡単なチャットボットを作ってみよう（フロントエンド編）](https://qiita.com/fsd-takizawa/items/b4d3e517879a873a90a7)