用 app().registerHandler() 注册函数式路由,如 app().registerHandler(“/api/users”, [](const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback){…}, {Get});路径参数用 req->getParameter(“id”) 获取;JSON 响应需显式设 CT_APPLICATION_JSON 且正确处理中文;POST body 须调用 req->getJsonObject() 触发解析;热重载依赖 drogon_ctl 监听。cc 文件。

怎么用 Drogon 写一个最简 RESTful 路由
直接注册 HTTP 方法 + URL 路径,不需要手写 handler 类。Drogon 的路由注册是函数式风格,核心就是 app().registerHandler()。
-
app().registerHandler("/api/users", [](const HttpRequestPtr& req, std::function<void httpresponseptr>&& callback){……}, {Get});</void>是最常用写法,Get表示只响应 GET 请求 - 路径支持参数占位:
/api/users/{id},对应 handler 里用req->getParameter("id")取值(不是req->pathParameters(),那是旧版 API) - 别漏掉第三个参数——HTTP 方法数组,不传默认响应所有方法,容易被扫描工具误触发 POST/PUT
- handler 回调必须用
std::function<void httpresponseptr></void>类型,不能用 lambda 捕获局部变量后直接返回裸指针,否则崩溃
HttpResponsePtr 怎么构造 JSON 响应才不出错
Drogon 不内置 JSON 库,得自己选(推荐 nlohmann/json),但序列化逻辑要绕开两个坑:
- 别用
response->setBody(json.dump())直接塞字符串——这样 Content-Type 默认是text/plain,前端 fetch 会解析失败;必须显式调用response->setContentTypeCode(CT_APPLICATION_JSON) - 如果 JSON 数据含中文,
json.dump()默认不转义 Unicode,浏览器可能乱码;加参数json.dump(-1, '', json::error_handler_t::replace)或改用json.dump(2,' ', json::error_handler_t::strict)更稳妥 - 大对象别在 handler 里现场 new
Json::Value(如果你用 JsonCpp),Drogon 的HttpResponse生命周期短,建议用栈上对象或std::shared_ptr
为什么 postRoute 注册后收不到 POST body
常见现象:curl 发了 JSON body,但 req->body() 是空字符串,req->getJsonObject() 返回空指针。
- Drogon 默认不自动解析 body,必须手动调用
req->getJsonObject()或req->getFormObject()才触发解析;直接读req->body()拿到的是原始字节流(可能含换行、编码问题) - 如果用
req->getJsonObject(),Content-Type 必须是application/json,且 body 必须是合法 JSON,否则返回空,不会抛异常 - 表单提交(
application/x-www-form-urlencoded)要用req->getFormObject(),别混用;multipart/form-data 需额外处理req->uploadFiles() - 测试时 curl 记得加
-H "Content-Type: application/json",否则 Drogon 当作普通文本处理
开发期热重载没生效?检查 drogon_ctl 和编译配置
Drogon 自带热重载靠 drogon_ctl 工具监听源码变化并重启进程,但默认不启用,且和 CMake 配置强相关。
立即学习 “C++ 免费学习笔记(深入)”;
- 确保 CMakeLists.txt 里有
add_executable(${PROJECT_NAME} ……)并调用了target_link_libraries(…… drogon::drogon),否则drogon_ctl找不到可执行文件入口 - 运行前先执行
drogon_ctl create project myapp生成标准结构,别手动拼目录——drogon_ctl只监控controllers/、filters/等固定路径下的 .h/.cc 文件 - 修改头文件(.h)不会触发重载,必须改 .cc 实现文件;如果改了
main.cc,得手动重启drogon_ctl - Windows 下杀进程不干净会导致端口占用,下次启动失败,记得任务管理器里关掉残留的
myapp.exe