LoginSignup
9
9

More than 1 year has passed since last update.

C++のWebフレームワーク「Drogon」を触ってみた

Posted at

はじめに

こんにちは、tuq376sです。
この記事は「ラクス Advent Calendar 2022」の21日目の記事になります。

先日、久しぶりに学生時代に使ってたC++をまたやりたいなぁと思ってなんとなく調べていたら、DrogonというWebフレームワークに行き当たりました。
フレームワークと言えば、学生のころは学習のために全部自力でプログラムを書いていたのもあり、初めて使ったときは一言一句把握せず使うことになんとなく不安になったのを覚えています。(今ではむしろ頼りきりですが……。)
とにもかくにも、C++でのWebアプリケーションはまさに学生の頃にも課題で作ったことがあり気になったので、触ってみた内容を紹介したいと思います。

Drogonとは

Drogonは、C++14以降で利用できるWebフレームワークです。
C++が実際にWebアプリケーションで使われているイメージはあんまりなかったのですが、どうやら処理が速いところが良い様子。
クロスプラットフォームでいろいろなOSに対応している他、DBもPostgreSQL, MySQL, Sqlite3, Redisが使えるようです。

環境構築

Wikiのインストがけっこう読みやすいので、ここを読みながら実施していきます。
今回は、WSLにインストールしたてのまっさらなUbuntu 22.04.1 LTSで実施しました。

事前にインストールが必要なもの

Drogonの前に、ビルドに必要な以下を全てインストールします。

  • git (今回はデフォルトで入っていたのでインストールしていませんが)
  • gcc
  • g++
  • cmake
  • jsoncpp (aptでインストールできなかったのでGithubからクローンして自前でビルドしました)
  • uuid-dev
  • openssl
  • zlib1g-dev

Drogonのインストール

必要なものが揃ったら、wikiの内容に従ってDrogonをインストールします。
事前に必要なものがインストールされていれば特に失敗することもないと思います。
(自分はg++だけ何故かインストールしていなくてハマりました)

$ git clone https://github.com/drogonframework/drogon
$ cd drogon
$ git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
$ sodo make && sudo make install

drogon_ctlコマンドの確認

無事にビルドが終わっているとdrogon_ctlというコマンドが使えるようになっています。
試しにバージョンを見てみると、ロゴとバージョン、各ライブラリが有効かどうかが表示されました。

$ drogon_ctl -v
     _
  __| |_ __ ___   __ _  ___  _ __
 / _` | '__/ _ \ / _` |/ _ \| '_ \
| (_| | | | (_) | (_| | (_) | | | |
 \__,_|_|  \___/ \__, |\___/|_| |_|
                 |___/

A utility for drogon
Version: 1.8.2
Git commit: 19f08786f0490de8e560d7f761b3166005a2d16d
Compilation:
  Compiler: /usr/bin/c++
  Compiler ID: GNU
  Compilation flags: -std=c++17 -I/usr/local/include
Libraries:
  postgresql: no  (pipeline mode: no)
  mariadb: no
  sqlite3: no
  openssl: no
  brotli: no
  boost: no
  hiredis: no
  c-ares: no

Hello,world! してみる

これでDrogonのインストールは完了です。
さっそく新しいプロジェクトを作って「Hello,world!」を表示してみます。
お約束だとしても、新しい技術に触れたときにこれはいつもわくわくするものなんですよね。

プロジェクト作成

プロジェクトの作成には先ほどのdrogon_ctlを使用します。

$ drogon_ctl create project my_first_project
create a project named my_first_project
$ ls
CMakeLists.txt  build  config.json  controllers  filters  main.cc  models  plugins  test  views

プロジェクトが作成されたら、buildディレクトリ内でビルドします。

$ cd my_first_project
$ cd build/
$ cmake ..
$ make

これだけで最低限の設定は完了です。
サーバーをこの状態で立ち上げてみます。

$ sudo ./my_first_project

http://localhostにアクセスして、404画面が表示されれば無事成功です。
image.png

コントローラ作成

「Hello,world!」を表示するだけならこのままindex.htmlを作って終わりなのですが、せっかくなのでコントローラを作ってルーティングをしてみます。
作成コマンドは以下です。実施すると「TestController.h」「TestController.cc」が作成されていることがわかります。

$ drogon_ctl create controller TestController    //作成したプロジェクト直下で実施
Create a http simple controller: TestController
$ ls
CMakeLists.txt     TestController.h  config.json  filters  models   test
TestController.cc  build             controllers  main.cc  plugins  views

TestController.h

「TestController.h」はルーティングに使われます。
ファイル内を見るとPATH_ADD()でパスを指定できるようです。

TestController.h
#pragma once
#include <drogon/HttpSimpleController.h>
using namespace drogon;
class TestController : public drogon::HttpSimpleController<TestController>
{
  public:
    void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override;
    PATH_LIST_BEGIN
    // list path definitions here;
    // PATH_ADD("/path", "filter1", "filter2", HttpMethod1, HttpMethod2...);

    PATH_ADD("/", Get);       //追加

    PATH_LIST_END
};   

TestController.cc

「TestController.cc」は実際の内部処理を記述していきます。今回は公式のwikiをそのまま拝借して、単純なHTTPレスポンスを返します。

TestController
#include "TestController.h"

void TestController::asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback)
{
    // write your application logic here
    auto resp=HttpResponse::newHttpResponse();
    resp->setStatusCode(k200OK);
    resp->setContentTypeCode(CT_TEXT_HTML);
    resp->setBody("Hello, world!");
    callback(resp);
}
~            

ビルドして表示

これでコントローラの作成も完了ですので、先ほどと同じようにビルドしてhttp://localhostにアクセスしましょう。
image.png
きちんと表示されました!

おわりに

ということで、今回はWebフレームワークのDrogonを触ってみました。
ほとんど環境構築と導入だけだったのでC++のコードを書いたわけではないですが、久しぶりにcmake使ったりusing namespaceの文字列を見られて楽しかったです。
Drogon自体もいろいろできそうな気がするので、年末年始にもう少し触ってみたいですね。

ここまで読んでいただきありがとうございました。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9