httplib搭配cjson是嵌入式restful api最稳妥组合,因其单头文件、零依赖、静态编译仅约300kb,内存占用低、无动态链接风险,且cjson解析需手动控制、避免隐式拷贝导致栈溢出。

嵌入式场景下,用 C++ 实现 RESTful API 接口 + JSON 解析,核心是「够轻、不崩、能跑通」——httplib 搭配 cJSON 是最稳妥的组合,比 cpprestsdk 或 Drogon 少掉 90% 的内存和启动开销,且无动态链接依赖。
为什么选 httplib 而不是 Crow 或 Drogon
在资源受限的嵌入式 Linux(比如 ARM Cortex-A7 + 256MB RAM)上,Drogon 启动即占 15MB+ 内存,Crow 默认启用多线程 + 异步日志,容易触发 OOM;而 httplib 单头文件、零依赖、静态编译后二进制仅 300KB 左右,且默认单线程阻塞模型,对看门狗和中断响应更友好。
-
httplib::Server不自动解析 JSON body,必须手动读取req.body再交给解析器——这反而是优点:避免隐式拷贝大 payload 导致栈溢出 - 它不内置路由参数提取(如
/users/{id}),但支持正则匹配路径,对固定结构的嵌入式 API(如/api/sensor/temperature)已足够 - 若需 HTTPS,直接传入
SSLServer类型,但注意:OpenSSL 1.1.1+ 必须静态链接,否则交叉编译时libssl.so版本不匹配会段错误
cJSON 解析 JSON body 的三个硬性条件
常见错误是调用 cJSON_Parse() 返回 NULL 却不检查错误原因,实际 80% 是因为:req.body 带 BOM、换行符未 trim、或 Content-Type 不是 application/json 导致前端发了 form-data。
- 必须先检查请求头:
if (req.headers.find("content-type") == req.headers.end() || req.headers.at("content-type").find("application/json") == std::string::npos),否则直接拒收 -
cJSON_Parse()输入指针不能为nullptr,且字符串必须以\0结尾;req.body.c_str()安全,但req.body.data()在某些 httplib 版本中可能未保证 null-terminated - 解析失败时,用
cJSON_GetErrorPtr()取地址比打印strerror(errno)更准——JSON 错误和系统错误无关
GET/POST 接口写法差异与典型陷阱
嵌入式 API 多数只用 GET(读传感器)和 POST(写配置),但两者的处理逻辑完全不同:GET 参数从 URL 查询串来,POST body 才是 JSON。
- GET 请求中,
req.path是解码后的路径(如/api/v1/log?level=debug),参数用httplib::detail::parse_query_text(req.path)提取,别手写std::string::find('?')—— URL 编码的%20会漏判 - POST 接口必须显式检查
req.body.size() > 0,否则空 body 传给cJSON_Parse()会返回NULL并静默失败 - 响应 JSON 时,
res.set_content(json_str, "application/json");必须带 MIME 类型,否则浏览器或 curl 默认当text/plain处理,fetch().json()报错
如何避免 cJSON 解析后内存泄漏
cJSON 所有 cJSON_CreateXXX() 出来的对象都必须配对 cJSON_Delete(),但在 httplib handler 中容易忽略作用域——handler 返回后栈变量销毁,但 cJSON 树节点还在堆上。
- 不要在 handler 里用
static cJSON* root缓存解析结果:多线程下会冲突,且嵌入式通常关多线程 - 推荐模式:每次请求都
cJSON* root = cJSON_Parse(req.body.c_str());→ 处理 →cJSON_Delete(root);,哪怕只有几字节 JSON - 若需复用结构体(如固定格式的配置写入),用
cJSON_Duplicate()深拷贝后再改,避免原树被意外修改影响后续请求
真正卡住嵌入式开发的,往往不是“怎么写”,而是“怎么不让它在运行三天后突然返回空响应”——重点盯死 cJSON_Parse 的返回值、req.body 长度、以及 res.set_content 的类型字符串拼写。这些地方错一个字符,设备就只能靠重启恢复。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











