Webサーバdrogon

# drogonとは
C＋＋でサーバーを建てられる、バックエンド用のフレームワーク

https://github.com/drogonframework/drogon



# 最初に

CmakeLists.txtを作る。(中身はexampleのCmakelist.txtから取ってきて必要に応じて改変する)
buildディレクトリを作っておく。

# mainファイルの書き方。

```cpp
//Drogonフレームワークのヘッダーファイルをインクルード
#include <drogon/drogon.h>
//Drogonの名前空間を使用することを宣言。
using namespace drogon;
//エントリーポイント。Webサーバーの起動とリクエストの処理を行う。
int main(){
     app().registerHandler("/hello?user={user-name}",
    [](const HttpRequestPtr 
    &,std::function<void(const HttpResponsePtr &)> 
    &&callback,const std::string &name) 
    {
//新しいHttpResponseオブジェクトを作成。
     auto resp = HttpResponse::newHttpResponse();
     resp->setBody("こんにちは, " + name + "!");
//callback(resp);を呼び出すことで、レスポンスをクライアントに送信。
     callback(resp);
     },
     {Get});

    LOG_INFO << "Server running on 127.0.0.1:8848";
    app().addListener("127.0.0.1", 8848).run();
}
```

このコードは、Drogonを使用してシンプルなWebサーバーを作成し、特定のパスに対するGETリクエストを処理して応答を返す。

app().registerHandler("/hello?user={user-name}", [](const HttpRequestPtr&, std::function<void(const HttpResponsePtr&)>&& callback, const std::string& name) { ... })の部分では、/helloというパスに対してGETメソッドのハンドラーを登録している。このハンドラーは、リクエストのクエリパラメーター（?user={user-name}"）からユーザー名を取得し、応答として「こんにちは、ユーザー名!」というメッセージを返す。

resp->setBody("こんにちは, " + name + "!");では、レスポンスのボディに「こんにちは、ユーザー名!」というメッセージを設定。

LOG_INFO << "Server running on 127.0.0.1:8848";によって、サーバーが特定のアドレス（127.0.0.1）とポート（8848）で実行中であることがログに表示される。

app().addListener("127.0.0.1", 8848).run();を呼び出すことで、Drogonアプリケーションのリスナーが指定のアドレスとポートで起動し、クライアントからのリクエストを待ち受ける。

127.0.0.1:8848/hello?user=omochi とかで実行するとこんな感じに
![スクリーンショット 2023-06-06 11.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092001/181c2ba0-587b-054e-05e2-da74f4a6d4e5.png)

末尾につける文字ごとに処理を変えられるので、同じサーバーで複数の表示ができます。

![スクリーンショット 2023-06-06 12.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092001/ae136630-5564-9f4a-e7d5-11d876541095.png)

# 注意

ファイルを新しく作ったり、名前を変えたりしたらちゃんとCmakeListを書き換える（よく忘れるので）
add_executable()に変えたり新しく作ったファイルを追加しておく。

# コントローラー

このコードは、Drogonフレームワークを使用して独自のコントローラー（Omochi）を作成する。

```cpp
//DrogonのHttpControllerヘッダーファイルをインクルード
#include <drogon/HttpController.h>
using namespace drogon;

//Omochiクラスを定義。HttpControllerクラスを継承している。
class Omochi: public HttpController<Omochi>
{
    public:
    METHOD_LIST_BEGIN
//genericHelloとmocchiというメソッドを
//Omochiクラスに追加しています。
    METHOD_ADD(Omochi::genericHello, "/", Get);
    METHOD_ADD(Omochi::mocchi, "/puripuri",Get);
    METHOD_LIST_END

    protected:
    void genericHello(const HttpRequestPtr &,
    std::function<void(const HttpResponsePtr &)> 
    &&callback)
    {
        auto resp = HttpResponse::newHttpResponse();
        resp->setBody(
            "Hello, this is a generic hello 
             message from the Omochi "
            "controller");
        callback(resp);
    }

    void mocchi(
        const HttpRequestPtr &,
        std::function<void(const HttpResponsePtr &)> 
        &&callback)
    {
        auto resp = HttpResponse::newHttpResponse();
        resp->setBody(
            "puri_puri_omochi");
        callback(resp);
    }
};
```

新しく作ったら忘れずに、CmakeListのexecutableに加えておく。

METHOD_LIST_BEGINとMETHOD_LIST_ENDの間に、
今回作ったハンドラを入れておく。
「/」の後を、/puripuriとか、/mochimohiとか好きな文字に変更できる。

protected:の後にはハンドラ関数を作って、処理を指定できる。
 
実行してみるとこんな感じ

![スクリーンショット 2023-06-06 12.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092001/d1f24dc9-f022-a795-6ddd-e0b3c69c06aa.png)

このように、OmochiクラスはDrogonのHttpControllerを継承し、複数のメソッドを定義して異なるURLパスとHTTPメソッドに対応するハンドラーを作成できる。各ハンドラーでは、レスポンスオブジェクトを作成し、特定のメッセージを設定してクライアントに応答を返すことができるようになる。これにより、Webアプリケーションの特定のエンドポイントに対する動作を定義することができる。