资讯详情

资讯详情

cpp-httplib 服务端实战:注册 GET / POST / PUT / DELETE 处理器与请求数据读取

后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载本指南围绕 cpp-httplib 的httplib::Server展开讲解如何按 HTTP 方法注册路由处理器、在处理器中读取查询参数与请求头、设置响应状态码与响应头以及如何让服务器非阻塞地启动。读完本文你将能够用纯头文件库在几十行代码内搭建一个支持多方法路由的 REST API 服务端并理解其底层注册与参数解析机制。1. 按 HTTP 方法注册处理器的基本用法cpp-httplib 采用一个方法一个路由表的注册模型对httplib::Server实例调用Get()、Post()、Put()、Delete()并传入一个 URL 模式pattern与一个 lambda 处理器即可完成路由绑定。完整的入门示例#include httplib.h int main() { httplib::Server svr; svr.Get(/hello, [](const httplib::Request req, httplib::Response res) { res.set_content(Hello, World!, text/plain); }); svr.Post(/api/items, [](const httplib::Request req, httplib::Response res) { // req.body holds the request body res.status 201; res.set_content(Created, text/plain); }); svr.Put(/api/items/1, [](const httplib::Request req, httplib::Response res) { res.set_content(Updated, text/plain); }); svr.Delete(/api/items/1, [](const httplib::Request req, httplib::Response res) { res.status 204; }); svr.listen(0.0.0.0, 8080); }要点说明处理器签名每个处理器接收(const Request, Response)两个参数对应源码中Server::Handler std::functionvoid(const Request , Response )见 httplib.h。Request封装了方法、路径、查询参数、请求头与请求体Response用于写入状态码、响应头与响应体。设置响应体与 Content-Typeres.set_content()一次完成设置 body 和 Content-Type两件事。从源码看它会先清空已存在的Content-Type头再写入新的值并同时重置内部压缩编码状态见 httplib.h。设置状态码直接给res.status赋值即可例如 POST 创建资源返回201DELETE 删除成功返回204无响应体。启动服务器listen()会绑定地址并进入阻塞事件循环。默认监听所有接口可用0.0.0.0仅本机访问可用localhost。仓库中的 example/server.cc 是与此模型一致的真实示例svr.Get(/hi, ...)返回文本、svr.Get(/dump, ...)回显请求头、svr.Get(/stop, ...)调用svr.stop()优雅退出并组合了set_error_handler与set_logger可作为完整服务的参考模板。1.1 内置方法与更丰富的重载除了文档示例中的四种方法Server还内置了Patch()与Options()注册函数并额外提供了带内容读取器content reader的重载版本用于大体积请求体的流式处理见 httplib.hServer Get(const std::string pattern, Handler handler); Server Post(const std::string pattern, Handler handler); Server Post(const std::string pattern, HandlerWithContentReader handler); Server Put(const std::string pattern, Handler handler); Server Put(const std::string pattern, HandlerWithContentReader handler); Server Patch(const std::string pattern, Handler handler); Server Patch(const std::string pattern, HandlerWithContentReader handler); Server Delete(const std::string pattern, Handler handler); Server Delete(const std::string pattern, HandlerWithContentReader handler); Server Options(const std::string pattern, Handler handler);其中HandlerWithContentReader是带ContentReader回调参数的函数类型允许处理器在请求体尚未完整读入内存时按块消费数据适合上传大文件等场景。1.2 内置方法之外的自定义方法对于 WebDAV 的PROPFIND等不在内置集合中的 HTTP 方法需要调用CustomRoute()注册。源码注释明确指出注册该方法本身才是服务器接受它的前提未注册的方法会被以 400 拒绝且method必须是合法的方法 token、不能与内置方法重名否则注册失败会让is_valid()返回false进而导致listen()失败见 httplib.h。详细用法参见 S23. Handle custom HTTP methods。2. 在处理器中读取查询参数查询字符串query string是 GET 请求携带参数的主要方式。cpp-httplib 将其解析进Request::params并提供配套的取值接口svr.Get(/search, [](const httplib::Request req, httplib::Response res) { auto q req.get_param_value(q); auto limit req.get_param_value(limit); res.set_content(q q , limit limit, text/plain); });2.1 先判断再取值has_paramget_param_value()在参数不存在时返回空字符串若需要区分参数缺失与参数值为空应先用req.has_param(q)判断存在性。从源码实现看has_param实际是检查params这个multimap中是否存在该 key见 httplib.h。2.2 重复参数的完整处理params是std::multimap因此同一个 key 可以出现多次如?tagatagb。源码提供了一组配套接口见 httplib.hget_param_value(key, id)按序号取值id默认0get_param_values(key)取回该 key 的全部值组成的std::vectorstd::stringget_param_value_count(key)返回重复次数。仓库测试 test/test.cc 验证了这一行为?tagfirsttagsecondtagthird场景下get_param_value(tag)返回first按id0/1/2 分别返回first/second/third越界id3返回空串。另外 test/test.cc 还验证了解析结果会保留参数在 URL 中出现的原始顺序这对依赖顺序的签名校验类业务很关键。3. 读取请求头并回写响应头请求头统一通过req.get_header_value()读取它按 key 匹配且不区分大小写缺失时返回传入的默认值未传则返回空串svr.Get(/me, [](const httplib::Request req, httplib::Response res) { auto ua req.get_header_value(User-Agent); res.set_content(UA: ua, text/plain); });3.1 响应头的写入向响应添加自定义头使用res.set_header(Name, Value)例如回显跟踪 ID、设置X-RateLimit-Limit或WWW-Authenticate等res.set_header(X-Request-Id, req.get_header_value(X-Request-Id)); res.set_header(X-Powered-By, cpp-httplib);从源码实现看set_header最终走detail::set_header(headers, key, val)为多值头提供了追加能力见 httplib.h。Request侧还有get_header_value_u64()解析无符号整型头、get_header_value_count()统计重复次数等实用变体见 httplib.h。4. 让服务器非阻塞启动listen()与线程listen()是阻塞调用它进入事件循环后直到stop()被调用或发生错误才返回。若希望在等待服务就绪的同时继续做其他事情有两个方向4.1 丢进std::threadhttplib::Server svr; svr.Get(/hello, [](const httplib::Request req, httplib::Response res) { res.set_content(Hello, World!, text/plain); }); std::thread t([]() { svr.listen(0.0.0.0, 8080); }); // 主线程继续做初始化工作... t.join();4.2 分步启动bind_to_any_portlisten_after_bind仓库测试中大量使用了分步启动模式如 test/test.cc先用bind_to_any_port(host)完成绑定并返回实际端口适合端口冲突或动态端口场景再在后台线程调用listen_after_bind()进入监听随后用wait_until_ready()或轮询is_running()确认服务已就绪auto port svr.bind_to_any_port(0.0.0.0); std::thread t([] { svr.listen_after_bind(); }); svr.wait_until_ready();这一模式也是文档中推荐的 S18. Control startup order withlisten_after_bind的主题适合需要精确控制启动顺序的容器化部署与测试框架。5. 继续深入相关 Cookbook 篇章路径参数/users/:id风格与查询参数是两套独立机制见 S03. Use path parameters自定义 HTTP 方法如 WebDAVPROPFIND见 S23. Handle custom HTTP methods在处理器之外统一注入逻辑、传递用户数据、自定义错误页等进阶能力可从 Cookbook 索引 的 Server 章节按需取用完整可编译的参考实现位于 example/server.cc对应的 HTTP 客户端样例见 example/client.cc可用于本地联调验证本文中的各个处理器。赞分享后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载相关推荐cpp-httplib 服务端路由入门用 Get/Post/Put/Delete 注册 HTTP 方法处理器cpp httplib 服务端路由入门用 Get/Post/Put/Delete 注册 HTTP 方法处理器 本文基于 cpp httplibC hea后端网络curl HTTP请求实战GET、POST、PUT、DELETE全解析curl是命令行工具中的多功能工具用于传输数据支持多种协议尤其擅长HTTP请求处理。本文将全面解析curl的GET、POST、PUT、DELETE四种核心CLI网络通信VLFM三阶段导航策略拆解初始化、探索、目标导航全流程代码实现原理指南VLFM三阶段导航策略拆解初始化、探索、目标导航全流程代码实现原理指南 VLFM Vision Language Frontier Maps视觉 语教程教育人工智能大模型AI 技能上一篇WAMR-2.4.1下一篇Daft 读取 MCAP 机器人多模态日志daft.read_mcap 完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →