
后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载本篇指南讲解如何在 C header-only 库 cpp-httplib 中发送和接收 JSON 数据。cpp-httplib 本身刻意不内置 JSON 解析器本指南以 nlohmann/json 为例完整覆盖客户端Post/Put/Patch发送 JSON、res-body解析 JSON 响应、服务端接收与返回 JSON 的完整流程并给出 Content-Type 校验、错误处理与默认头配置等实战要点读完即可写出可运行的 JSON API 客户端与服务端代码。为什么 cpp-httplib 不内置 JSON 解析器cpp-httplib 是一款单文件、header-only 的 HTTP/HTTPS 客户端与服务端库其定位是纯粹的网络传输层。因此它不包含 JSON 解析器——文档明确说明需要自行搭配一个 JSON 库如 nlohmann/json来构建和解析 JSON。这样做的好处是库本体保持轻量与聚焦JSON 的序列化/反序列化策略完全由使用者决定。集成方式非常简单客户端代码中加入#include httplib.h #include nlohmann/json.hpp即可。cpp-httplib 以std::string作为请求与响应体的载体天然能与任何以字符串为基础的 JSON 库对接。客户端发送 JSON 请求体发送 JSON 最直观的方式是使用httplib::Client的Post()重载把 JSON 字符串作为第二个参数、Content-Type 作为第三个参数传入httplib::Client cli(http://localhost:8080); nlohmann::json j {{name, Alice}, {age, 30}}; auto res cli.Post(/api/users, j.dump(), application/json);这里j.dump()将nlohmann::json对象序列化为std::string随后 cpp-httplib 会将其作为请求体发送并在请求头中写入Content-Type: application/json。同样的模式适用于Put()和Patch()// PUT整体更新资源 auto res cli.Put(/api/users/1, j.dump(), application/json); // PATCH局部更新资源 auto res cli.Patch(/api/users/1, j.dump(), application/json);从 httplib.h 的源码可见Client::Post提供了多个重载其中与 JSON 场景直接相关的是Result Post(const std::string path, const std::string body, const std::string content_type, UploadProgress progress nullptr);即「路径 请求体字符串 Content-Type」三元组Puthttplib.h与Patchhttplib.h提供了签名完全一致的重载。这三个重载的底层实现在 httplib.h 中统一转发给内部实现并在设置请求头时执行if (!content_type.empty()) { req.set_header(Content-Type, content_type); }见 httplib.h确认 Content-Type 会在组装请求时被写入。警告Content-Type 不能省略。如果省略第三个参数Content-Type服务器可能无法把请求体识别为 JSON。务必每次都显式传入application/json。此外如果你需要在上传 JSON 的同时携带额外请求头、或跟踪上传进度可以使用带Headers与UploadProgress的重载例如httplib::Headers headers {{X-API-Key, secret}}; auto res cli.Post(/api/users, headers, j.dump(), application/json);客户端接收并解析 JSON 响应Get()请求返回的res-body是一个std::string可以直接交给你的 JSON 库解析auto res cli.Get(/api/users/1); if (res res-status 200) { auto j nlohmann::json::parse(res-body); std::cout j[name] std::endl; }在源码中Request::body与Response::body均定义为std::string见 httplib.h 与 httplib.h因此整个「HTTP 响应体 → JSON 对象」的转换不需要任何中间层。解析前务必注意两点先检查状态码再解析服务器出错时有时会返回 HTML 错误页而非 JSON直接parse会抛出异常。上面的res res-status 200守卫就是最小安全写法。某些 API 要求Accept: application/json头部分服务端会根据Accept头决定响应格式。如果客户端没有携带该头服务端可能返回 HTML 或其他格式。如果你要反复调用同一 JSON API可以为每个请求补上Accept头会显得繁琐。此时可参考 C03. 设置默认请求头 中介绍的set_default_headers()一次性注册所有请求共用的头httplib::Client cli(https://api.example.com); cli.set_default_headers({ {Accept, application/json}, {User-Agent, my-app/1.0}, }); auto res cli.Get(/users); // 每次请求都会自动携带上述默认头需要说明的是set_default_headers()会整体替换已有的默认头集合即使只新增一项也要把完整集合重新传入。每次请求仍然可以叠加额外的 per-request 头二者会同时发送给服务器。服务端接收 JSON 请求并返回 JSON 响应客户端的另一端cpp-httplib 服务端同样以std::string承载请求体。服务端Post处理器中req.body就是原始请求体字符串直接传给 JSON 库解析返回时调用res.set_content(out.dump(), application/json)即可。完整示例见 S02. 接收 JSON 请求并返回 JSON 响应#include httplib.h #include nlohmann/json.hpp int main() { httplib::Server svr; svr.Post(/api/users, [](const httplib::Request req, httplib::Response res) { try { auto in nlohmann::json::parse(req.body); nlohmann::json out { {id, 42}, {name, in[name]}, {created_at, 2026-04-10T12:00:00Z}, }; res.status 201; res.set_content(out.dump(), application/json); } catch (const std::exception e) { res.status 400; res.set_content({\error\:\invalid json\}, application/json); } }); svr.listen(0.0.0.0, 8080); }代码中体现了两个关键点req.body是普通std::string直接传给nlohmann::json::parse即可响应侧先把nlohmann::json用dump()转成字符串再通过res.set_content()设置响应体与Content-Type: application/json。Response::set_content的底层实现在 httplib.h它会写入响应体并调用set_header(Content-Type, content_type)见 httplib.h同时重置内容编码保证响应体不会被二次压缩处理。try/catch是 JSON 服务端处理器必备的防护parse遇到非法 JSON 会抛出异常捕获后返回400 Bad Request与 JSON 格式的错误信息比直接崩溃或返回空响应专业得多。严格校验请求的 Content-Type如果希望接口「只接受 JSON」应在进入业务逻辑前先校验请求头。Request::get_header_value()可以读取请求头svr.Post(/api/users, [](const httplib::Request req, httplib::Response res) { auto content_type req.get_header_value(Content-Type); if (content_type.find(application/json) std::string::npos) { res.status 415; // Unsupported Media Type return; } // ... 正常解析 JSON 并处理 });服务端在组装请求对象时也有对应逻辑当请求携带非空 body 但没有Content-Type头时会额外做兼容处理见 httplib.h 附近的实现。不过要严格限定 JSON 入参仍建议在处理器内显式校验返回标准的415 Unsupported Media Type。用一个辅助函数消除重复样板当多个接口都要「输出 JSON 响应」时相同的status set_content(dump())模式会反复出现。可以抽出一个小的 lambda 辅助函数auto send_json [](httplib::Response res, int status, const nlohmann::json j) { res.status status; res.set_content(j.dump(), application/json); }; svr.Get(/api/health, { send_json(res, 200, {{status, ok}}); });此后任何处理器只需一行send_json(res, code, json)即可返回结构化 JSON 响应。内存与性能注意点需要留意的是较大的 JSON 请求体最终会完整驻留在req.body中即整段 JSON 都会占用内存。对于超大 payload官方文档建议考虑流式接收——相关内容可参考 S07. 以流的形式接收 multipart 数据。同理客户端在收到大响应体时res-body也会整体保存在内存中。对常规 JSON 接口这完全不是问题只有当你处理 GB 级数据流时才需要考虑流式方案。完整链路小结客户端发送cli.Post(path, j.dump(), application/json)同样的(path, body, content_type)三参数模式适用于Put与Patch声明见 httplib.h客户端接收res-bodystd::string→nlohmann::json::parse解析前先检查状态码与Accept头服务端接收req.body→nlohmann::json::parse配合try/catch返回400服务端返回res.set_content(j.dump(), application/json)实现见 httplib.h防御要点客户端务必携带Content-Type: application/json服务端按需校验 Content-Type 并返回415长期调用同一 API 时用 C03 默认请求头 的set_default_headers()统一管理Accept/Authorization等头。至此你已经掌握了在 cpp-httplib 上搭建完整 JSON 通信链路所需的全部要素选择 JSON 库、发送请求体、解析响应体、校验 Content-Type、统一错误处理与默认头配置。这套模式可直接迁移到任意基于 cpp-httplib 的 REST 客户端或服务端项目中。赞分享后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载相关推荐最实用的JSON动态修改技巧nlohmann/json JSON Patch实战指南最实用的JSON动态修改技巧nlohmann/json JSON Patch实战指南 你是否还在手动解析和修改JSON文档面对复杂嵌套结构时是否感到无从下手序列化JSON for Modern C 中 nlohmann::json::is_number_unsigned()无符号整数判定的实现与实战JSON for Modern C 中 nlohmann::json::is_number_unsigned 无符号整数判定的实现与实战 本篇技术指南聚焦序列化libSQL / SQLite JSON 与 JSONB 性能测试指南基于 test/json 基准套件的完整实战libSQL / SQLite JSON 与 JSONB 性能测试指南基于 test/json 基准套件的完整实战 本文以 libSQL 仓库中的 libsq数据库关系型数据库嵌入式数据库后端数据同步创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考