C++ 並不是網頁開發(Web Development)的首選語言, 但是在對效能十分要求或者是需要在資源略為受限的環境執行時,可以考慮使用 C++。 就目前而言,C++ 較為有名的選擇為效能極高並且支援多項功能的 Drogon, 不用安裝依賴函式庫的 Oat++, 以及設計上較為輕量但是功能也較少的 Crow。 還有一個選擇是 Wt, 但是就我個人而言,我認為 Wt 的策略,也就是使用 C++ 撰寫 UI 然後函式庫再轉譯為 HTML/CSS/JavaScript 的方式並不是一個好的做法。
Crow 是一套 C++ micro web framework,採用 Header Only 的設計,其靈感來自於 Python's Flask, 支援 HTTP 1.1 以及 Websocket,使用 C++ ASIO library 構建,特別適合建立 RESTful API 或 Web 服務。 Crow 的原作者在 2017 年停止維護, 不過之後自由軟體社群有人複製出來一份新的分支接手進行維護,目前仍然持續開發中。
在安裝前需要已經先安裝 ASIO development files,下面是在 openSUSE 的安裝指令:
sudo zypper in asio-devel
我使用 source code 安裝:
git clone https://github.com/CrowCpp/Crow.git
mkdir build; cd build; cmake .. -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF
sudo make install
(在不編譯範例以及測試程式的情況下,Crow 只會安裝 CMake 相關檔案以及 header files,所以不用執行 make, 只需要使用 make install 安裝)
Crow 預設的靜態檔案資源放置在 static 目錄,但是可以透過巨集設定目錄。接下來寫一個簡單的靜態網頁伺服器驗證可以正確編譯與使用。
main.cpp
#define CROW_STATIC_DIRECTORY "public"
#define CROW_STATIC_ENDPOINT "/<path>"
#include "crow.h"
int main()
{
crow::SimpleApp app;
CROW_ROUTE(app, "/")
([](const crow::request&, crow::response& res) {
res.set_static_file_info("public/index.html");
res.end();
});
app.port(18080).run();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(Simple)
set(CMAKE_CXX_STANDARD 17)
# Search for Crow and required dependencies
find_package(Crow REQUIRED)
add_executable(simple main.cpp)
# Link the Crow library to your executable
target_link_libraries(simple PRIVATE Crow::Crow)
Crow 使用 Mustache 作為 template engine language, 接下建立一個簡單的網頁進行測試。 使用 Mustache 撰寫的網頁需要放在 templates 目錄下。
templates/fancypage.html
<!DOCTYPE html>
<html>
<body>
<p>Hello {{person}}!</p>
</body>
</html>
main.cpp
#include "crow.h"
// #include "crow_all.h"
int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/<string>")([](std::string name) {
auto page = crow::mustache::load("fancypage.html");
crow::mustache::context ctx({{"person", name}});
return page.render(ctx);
});
app.port(18080).multithreaded().run();
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(Simple)
set(CMAKE_CXX_STANDARD 17)
# Search for Crow and required dependencies
find_package(Crow REQUIRED)
add_executable(simple main.cpp)
# Link the Crow library to your executable
target_link_libraries(simple PRIVATE Crow::Crow)
編譯成功後執行,使用瀏覽器瀏覽 http://localhost:18080/Bob 進行測試。