c++ 微服务框架drogon c++如何使用drogon开发restful api

1次阅读

用 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 文件。

c++ 微服务框架 drogon c++ 如何使用 drogon 开发 restful api

怎么用 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
Drogon 的轻量级设计意味着很多“理所当然”的功能(比如自动 JSON 解析、跨域中间件、参数校验)都得自己补,而不是框架帮你兜底。最容易被忽略的是 Content-Type 显式设置和热重载的路径约定——这两处出问题,调试时间远超写业务逻辑。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-20发表,共计2202字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources