RESTinio:现代C++异步HTTP/WebSocket服务器库
本文详细介绍C++开源网络库RESTinio的核心特性、适用场景、跨平台安装编译教程,搭配多个可直接运行的实战用例(基础HTTP服务、GET/POST接口、静态资源访问),帮助C++开发者快速实现嵌入式高性能HTTP、WebSocket服务开发,无需依赖重型框架,轻量化落地RESTful接口开发。
一、RESTinio开源库详细介绍
1.1 什么是RESTinio?
RESTinio 是一款跨平台、头文件式、异步高性能的 C++ 嵌入式 HTTP(S)/WebSocket 开源库,基于 C++14/C++17 标准开发,底层依托独立版 ASIO 异步 I/O 模型,无需复杂编译链接,开箱即用,完美适配C++原生应用内嵌Web服务的开发场景。
区别于Boost.Beast、Poco等重型网络库,RESTinio主打轻量化、低侵入、高性能,专为嵌入式Web服务、后端轻量API、物联网网关、本地服务接口等场景设计,平衡了开发易用性与高并发性能,开源协议为宽松的BSD-3-Clause,支持商业项目免费使用。
1.2 核心特性
纯头文件依赖:核心库无需编译,引入头文件即可使用,仅依赖llhttp解析库,部署极其简单
异步高并发:基于ASIO异步I/O模型,支持单线程/多线程事件循环,高吞吐、低延迟,适配高并发接口场景
全协议支持:完整支持 HTTP1.0/1.1、HTTPS、WebSocket 双向通信
跨平台兼容:完美适配 Linux、Windows、macOS 全平台,无平台适配壁垒
极简API设计:摒弃冗余封装,原生支持RESTful风格接口开发,代码简洁易维护
轻量无依赖:不强制依赖Boost,可独立部署,极大减少项目体积
可定制性强:支持自定义路由、请求拦截、响应封装、日志、超时机制等扩展能力
1.3 适用场景
C++后端轻量RESTful API服务开发
桌面客户端内嵌本地HTTP服务、WebSocket通信服务
物联网设备、嵌入式设备的小型Web服务接口
高性能低延迟的微型网关、数据转发服务
不想引入重型网络框架、追求轻量化部署的C++网络项目
二、RESTinio环境安装与编译部署
RESTinio 核心为头文件库,无需编译本体,仅需安装依赖库 llhttp,再引入源码头文件即可使用。本文提供 Linux 与 Windows 通用安装方案。
2.1 环境依赖
C++标准:C++14 及以上(推荐C++17)
依赖库:llhttp(HTTP协议解析库)、cmake3.10+、gcc7+/VS2019+
2.2 Linux(Ubuntu/Debian)安装教程
步骤1:安装基础依赖
sudo apt update sudo apt install git cmake gcc g++ make步骤2:克隆RESTinio源码
git clone https://github.com/Stiffstream/restinio.git cd restinio mkdir build && cd build步骤3:编译安装依赖llhttp
# cmake编译配置 cmake -DRESTINIO_BUILD_EXAMPLES=ON -DRESTINIO_DEP_LLHTTP=ON .. # 编译 make -j4 # 系统安装(可选,全局调用) sudo make install参数说明:RESTINIO_BUILD_EXAMPLES=ON编译官方示例代码,方便学习参考;默认开启llhttp依赖编译,无需手动配置。
2.3 Windows安装配置(VS2019+)
克隆源码:
git clone https://github.com/Stiffstream/restinio.git打开CMake-GUI,加载源码目录,生成VS工程文件
勾选
RESTINIO_BUILD_EXAMPLES、RESTINIO_DEP_LLHTTP生成解决方案,使用VS编译即可
项目配置中引入
restinio/include头文件目录即可开发
2.4 项目编译通用指令
自建项目编译时,指定C++标准、头文件路径、链接依赖,编译指令示例:
g++ -std=c++17 main.cpp -o rest_demo -I./restinio/include -lllhttp -pthread三、RESTinio实战可运行用例
所有示例代码均开箱即用,复制编译后直接运行,适配所有安装环境,覆盖基础服务、GET/POST接口、参数获取等常用场景。
用例1:最简HTTP服务(Hello World)
实现最基础的本地HTTP服务,监听8080端口,访问返回固定文本。
#include <restinio/all.hpp> #include <iostream> // 命名空间别名,简化代码 namespace rui = restinio; int main() { try { // 初始化单线程HTTP服务 rui::run(rui::server_traits_t<rui::default_single_thread_traits_t>{} .address("0.0.0.0") // 监听所有网卡 .port(8080) // 服务端口 .request_handler([](auto req) { // 统一响应所有请求 return req->create_response() .append_header(rui::http_field::content_type, "text/plain; charset=utf-8") .set_body("Hello RESTinio! C++高性能HTTP服务部署成功✅") .done(); }) ); } catch (const std::exception& e) { std::cerr << "服务异常:" << e.what() << std::endl; return -1; } return 0; }运行测试:编译执行后,浏览器访问http://127.0.0.1:8080即可看到输出结果。
用例2:RESTful GET接口(带URL参数)
#include <restinio/all.hpp> #include <iostream> namespace rui = restinio; int main() { try { // 多路由处理器 auto router = rui::router::create_router( // 匹配GET /user/{id} 动态路由 rui::router::get("/user/:id", [](auto req) { // 获取URL路径参数 std::string user_id = req->path_params()["id"]; // 获取URL查询参数 std::string name = req->query_params().get_value_or("name", "默认用户"); // 返回JSON格式响应 return req->create_response() .append_header(rui::http_field::content_type, "application/json; charset=utf-8") .set_body(R"({"code":200,"msg":"查询成功","user_id":")" + user_id + R"(","name":")" + name + R"("})") .done(); }), // 根路径路由 rui::router::get("/", [](auto req) { return req->create_response() .set_body("欢迎使用RESTinio GET接口!示例:/user/1001?name=test") .done(); }) ); // 启动服务 rui::run(rui::server_traits_t<rui::default_single_thread_traits_t>{} .address("0.0.0.0") .port(8080) .request_handler(std::move(router)) ); } catch (const std::exception& e) { std::cerr << "服务异常:" << e.what() << std::endl; return -1; } return 0; }测试接口:浏览器/Postman访问http://127.0.0.1:8080/user/1001?name=张三,可正常获取JSON数据。
用例3:POST接口(接收JSON数据)
实现POST接口,解析客户端上传的JSON数据,适用于接口提交、数据上报场景。
#include <restinio/all.hpp> #include <iostream> #include <nlohmann/json.hpp> namespace rui = restinio; using json = nlohmann::json; int main() { try { auto router = rui::router::create_router( // POST 数据接收接口 rui::router::post("/api/submit", [](auto req) { // 获取请求体数据 std::string body = req->body(); json res_json; try { // 解析JSON json req_json = json::parse(body); std::string username = req_json["username"]; int age = req_json["age"]; res_json["code"] = 200; res_json["msg"] = "数据接收成功"; res_json["data"]["username"] = username; res_json["data"]["age"] = age; } catch (...) { res_json["code"] = 400; res_json["msg"] = "JSON格式错误"; } return req->create_response() .append_header(rui::http_field::content_type, "application/json; charset=utf-8") .set_body(res_json.dump()) .done(); }) ); rui::run(rui::server_traits_t<rui::default_single_thread_traits_t>{} .address("0.0.0.0") .port(8080) .request_handler(std::move(router)) ); } catch (const std::exception& e) { std::cerr << "服务异常:" << e.what() << std::endl; return -1; } return 0; }测试方式:通过Postman发送POST请求,Body传入JSON数据即可测试接口。
四.WebSocket 实战
RESTinio 原生内置 WebSocket 支持,无需额外依赖,基于 ASIO 异步事件驱动,支持客户端连接管理、文本消息收发、二进制消息、连接断开回调、多客户端广播,非常适合实时数据场景:设备实时上报、上位机监控、日志推送、IM 简易通讯等。
下面提供一套可直接编译运行完整服务端示例,附带客户端测试方式,适配前文项目环境。
一、WebSocket 服务端完整代码
#include <restinio/all.hpp> #include <restinio/websocket/websocket.hpp> #include <iostream> #include <vector> #include <mutex> namespace rui = restinio; namespace rws = restinio::websocket; // 全局客户端连接池(多线程安全) std::mutex g_conn_mtx; std::vector<rws::ws_handle_t> g_ws_connections; // 广播消息给所有在线WebSocket客户端 void broadcast_all(const std::string& msg) { std::lock_guard<std::mutex> lock(g_conn_mtx); for (auto& handle : g_ws_connections) { if (auto ws = handle.lock()) { ws->send_text_message(msg); } } } int main() { try { // 路由配置 auto router = rui::router::create_router( // HTTP首页,提供测试提示 rui::router::get("/", [](auto req) { return req->create_response() .append_header(rui::http_field::content_type, "text/html;charset=utf-8") .set_body(R"( <h3>RESTinio WebSocket 服务</h3> <p>ws连接地址:ws://127.0.0.1:8080/ws</p> <p>可使用在线websocket测试工具连接</p> )") .done(); }), // WebSocket升级接口:访问 /ws 完成HTTP升级为WS长连接 rui::router::get("/ws", [](auto req) { // 执行HTTP协议升级,创建WebSocket会话 auto ws_handle = rws::upgrade(req, // WebSocket消息回调处理器 rws::ws_handler_t() // 客户端建立连接时触发 .on_open([](rws::ws_handle_t h) { std::cout << "新客户端已连接" << std::endl; std::lock_guard<std::mutex> lock(g_conn_mtx); g_ws_connections.push_back(h); broadcast_all("【系统通知】有新客户端上线"); }) // 收到客户端文本消息回调 .on_message([](rws::ws_handle_t h, rws::message_t msg) { if (msg.is_text()) { std::string recv_data = msg.as_text(); std::cout << "收到客户端消息:" << recv_data << std::endl; // 1. 单回发:回复当前发送客户端 if (auto ws = h.lock()) { ws->send_text_message("服务端已收到:" + recv_data); } // 2. 全局广播:转发给所有在线客户端 broadcast_all("【广播消息】客户端说:" + recv_data); } else if (msg.is_binary()) { std::cout << "收到二进制数据,长度:" << msg.as_binary().size() << std::endl; } }) // 客户端主动断开/异常断开回调 .on_close([](rws::ws_handle_t h) { std::cout << "客户端连接断开" << std::endl; std::lock_guard<std::mutex> lock(g_conn_mtx); // 移除失效连接 for (auto it = g_ws_connections.begin(); it != g_ws_connections.end();) { if (it->expired()) it = g_ws_connections.erase(it); else ++it; } broadcast_all("【系统通知】一位客户端下线"); }) // WebSocket错误回调 .on_error([](rws::ws_handle_t, std::error_code ec) { std::cerr << "WebSocket异常:" << ec.message() << std::endl; }) ); // 返回协议升级响应 return std::move(ws_handle); }) ); // 启动单线程http+websocket服务 rui::run(rui::server_traits_t<rui::default_single_thread_traits_t>{} .address("0.0.0.0") .port(8080) .request_handler(std::move(router)) ); } catch (const std::exception& e) { std::cerr << "服务启动失败:" << e.what() << std::endl; return -1; } return 0; }二、功能说明
- HTTP 升级 WS访问
ws://127.0.0.1:8080/ws自动完成 HTTP 101 Switching Protocols 协议升级; - 连接池管理全局容器存储所有客户端弱引用,多线程互斥锁保证线程安全;
- 四大核心回调
on_open:客户端上线,加入连接池并全局广播上线通知;on_message:区分文本消息 / 二进制消息,单客户端回复 + 全客户端广播;on_close:客户端下线,自动清理失效连接;on_error:捕获网络异常、读写错误;
- 广播机制任意客户端发送消息,所有在线客户端均可收到转发内容,简易聊天室效果;
三、测试方式
方式 1:在线 WebSocket 测试工具
打开网页 WS 在线调试工具,连接地址填写:ws://127.0.0.1:8080/ws发送任意字符串,观察:
- 服务端控制台打印接收日志;
- 当前客户端收到回执消息;
- 所有已连接客户端同步收到广播内容。
方式 2:前端简易测试页面
访问http://127.0.0.1:8080自带引导页面,可自行补充前端 JS 测试代码:
<script> let ws = new WebSocket("ws://127.0.0.1:8080/ws"); ws.onopen = ()=>{ console.log("连接成功"); ws.send("Hello Restinio WS"); }; ws.onmessage = (e)=>{ console.log("服务端返回:",e.data); }; ws.onclose = ()=>{ console.log("连接断开"); }; </script>四、拓展开发方向
- 多线程服务替换
default_single_thread_traits_t为多线程 trait,提升高并发 WS 连接承载; - 二进制数据传输适用于图像、传感器二进制数据流、设备点位上报
std::vector<char> bin_buf{0x01,0x02,0x03}; ws->send_binary_message(bin_buf); - 连接鉴权在
/ws路由中读取 Header / Cookie / URL 参数,校验 token,非法连接直接返回 403 拒绝升级; - 分组广播给每个 WS 连接绑定分组 ID,实现分组推送,替代全局广播;
- 心跳保活定时发送 ping/pong 帧,自动清理长时间无响应僵死连接;
五、性能与优势总结
极致轻量化:头文件库无编译负担,部署简单,占用资源极低,适配嵌入式、客户端内嵌场景
高并发高性能:异步I/O模型,单线程即可支撑万级并发,多线程模式性能翻倍,延迟极低
开发效率高:API简洁直观,路由配置简单,原生支持RESTful风格,无需冗余代码
跨平台无门槛:全平台兼容,无特殊依赖,Windows/Linux/macOS一套代码通用
开源商用友好:BSD-3-Clause协议,可免费用于个人、商业项目,无版权风险
六、常见问题解决
编译报错找不到llhttp:重新执行cmake编译,开启
RESTINIO_DEP_LLHTTP=ON,确保依赖编译成功C++版本报错:编译指令添加
-std=c++17,升级gcc/VS版本端口占用:修改代码中port端口,或关闭占用8080端口的进程
七、总结
RESTinio 是C++领域极具性价比的轻量化HTTP/WebSocket开源库,摒弃了重型框架的臃肿,兼顾性能与易用性,是C++开发者实现轻量Web服务、RESTful接口的首选工具。本文从库介绍、环境搭建、核心特性到实战用例全覆盖,新手可直接复刻部署,快速落地C++网络服务开发。
