【Crow】一款开源C++Web框架的安装与构建
Crow的安装与构建
前言
项目地址:
官方网站及文档说明:
缘由:
前几天一直在寻找一款C++的Web框架,通过不断的在Github、StackOverFlow以及搜索引擎上搜索,最终我还是选择了Crow这一框架,其他相关框架还有,restbed,served,nrgest,微软的C++ REST SDK等,Github相关搜索C++ REST framework...
结果在测试用例构建时候,似乎遇到了一个bug,于是我提交了一个Issues,得到了开发人员的回复,最终问题得到了解决,在此,再次感谢项目维护人员的付出!
配置环境
本篇文章为Linux安装。其他平台或具体最低要求等,还请见官方说明文档。
- Ubuntu 20.0.4
- GCC 9.4.0
- Boost 1.71
- ASIO 1.22.1
- Cmake 3.24.0
到目前为止,Corw依赖使用的ASIO已经为脱离BOOST的独立版。
相关安装参考文章:
- Boost与独立版的ASIO安装详见——独立版的Asio安装与使用](https://www.cnblogs.com/kolane/p/12057777.html)
- CMake安装详见——ubuntu安装cmake
相关问题解决参考文章:
Unable to locate package ——Linux新手入门:Unable to locate package错误解决办法
安装Crow
从源码安装,详见官方说明文档。
git clone https://github.com/CrowCpp/Crow.git
进入Crow目录,创建build目录,并进入。
mkdir build
cd build
cmake .. -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF
make install
Hello world
#include <crow.h>
int main(){
crow::SimpleApp app;
//测试
CROW_ROUTE(app, "/test")([](){
return "Hello world";
});
app.port(18888).multithreaded().run();
}
编译
- g++
g++ main.cpp -o main -lpthread
- CMake
# 指定版本
cmake_minimum_required(VERSION 3.24)
# 项目名
project(main)
# 使用指定源文件来生成目标可执行文件
add_executable(main main.cpp)
# 引入外部依赖包
find_package(Crow REQUIRED)
# 目标文件与库文件进行链接
target_link_libraries(main PUBLIC Crow::Crow)
测试
我的第一个程序
CROW_ROUTE(app, "/low_price_recommend").methods("POST"_method)([](const crow::request& req){
auto x = crow::json::load(req.body);
crow::json::wvalue return_ret({});//返回结果
if (!x){//参数不全
return_ret["status_code"] = std::string("0");
return crow::response(return_ret);
}else{
return_ret = myfounction.low_price_recommend(
x["flight_date"].s(),
x["flight_departure"].s(),
x["flight_arrival"].s(),
x["flight_agent"].s(),
x["flight_retCounts"].s());
return crow::response(return_ret);
}
});
- myfounction为我封装的一个类创建的对象,low_price_recommend为其中的一个方法。返回一个crow::json::wvalue。
- 变量x为具体传进来的参数
- crow::json::wvalue为返回的json格式数据 通过x[""].s()将对应的参数转成string
可能出现的问题
- CMake 找不到asio库,例如如下所示:
CMake Error at /usr/local/share/cmake-3.24/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
By not providing "Findasio.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "asio", but
CMake did not find one.
Could not find a package configuration file provided by "asio" with any of
the following names:
asioConfig.cmake
asio-config.cmake
Add the installation prefix of "asio" to CMAKE_PREFIX_PATH or set
"asio_DIR" to a directory containing one of the above files. If "asio"
provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
/usr/local/lib/cmake/Crow/CrowConfig.cmake:32 (find_dependency)
CMakeLists.txt:6 (find_package)
-- Configuring incomplete, errors occurred!
See also "/root/flight_query_system/query_system/build/CMakeFiles/CMakeOutput.log".
解决
打开并编辑这个文件/usr/local/lib/cmake/Crow/CrowConfig.cmake
大概在30行左右,将这行
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
替换为
list(APPEND CMAKE_MODULE_PATH ${CROW_CMAKE_DIR})
再次感谢Crow项目维护成员Luca Schlecker老哥的解答,以及所有维护此项目的成员。
官方GITTER讨论聊天室——crowfork/community
解决跨域问题
#include <crow.h>
#include "query/query.h"
#include "common/common.h"
#include "crow/middlewares/cors.h"
int main(){
crow::App<crow::CORSHandler> app;
auto& cors = app.get_middleware<crow::CORSHandler>();
cors
.global()
.origin("*")
.headers("origin, x-requested-with, accept, access-control-allow-origin, authorization, content-type")
.methods("POST"_method, "GET"_method, "PUT"_method, "DELETE"_method, "PATCH"_method, "OPTIONS"_method);
//测试
CROW_ROUTE(app, "/hello")([](){
return "Hello world";
});
app.port(18888).multithreaded().run();
}