当前位置: 首页 > article >正文

【C++】httplib:轻量级的 HTTP 服务器和客户端

本教程采用渐进式讲解方式,适用于 MinGW 环境。我们将从 httplib 的基本概念入手,通过一个小型 Demo 展示其核心用法,最后深入探讨高级功能与实际应用场景。


1. 简介

1.1 httplib 基本概念

httplib 是一个轻量级的 C++ HTTP 库,设计初衷是为嵌入式系统和资源受限环境提供简洁高效的 HTTP 支持。它是一个单头文件库(httplib.h),无需外部依赖,支持创建 HTTP 服务器和客户端,并兼容 HTTP/1.1 协议。httplib 的主要特点包括:

  • 无外部依赖:只需包含头文件即可使用,无需额外的库文件。
  • 跨平台:支持 Windows、Linux 和 macOS 等操作系统。
  • 简单易用:提供直观的 API,开发者可以快速实现 HTTP 请求和响应的处理。
  • 支持 SSL/TLS:通过集成 OpenSSL,可以启用 HTTPS 功能。

在 MinGW 环境下,编译时可能需要链接 ws2_32 库(视具体实现而定),方法是在编译命令中添加 -lws2_32 参数。也可以通过静态链接 MinGW 库来避免运行时依赖动态库。具体的编译命令如下:

g++ -o main.exe main.cpp -lws2_32 -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread
  • static-libgcc:静态链接 GCC 运行时库。
  • static-libstdc++:静态链接 C++ 标准库。
  • Wl,-Bstatic -lstdc++ -lpthread:确保标准库和线程库也以静态方式链接。

1.2 获取 httplib

由于 httplib 是头文件库,安装非常简单。你可以从其官方 GitHub 仓库(https://github.com/yhirose/cpp-httplib)下载最新版本的 httplib.h,然后将其放入项目目录,并在代码中通过以下方式包含:

#include "httplib.h"

接下来,我们将通过一个简单的 Demo 展示 httplib 的核心用法。


2. 快速入门:一个小型 Demo

为了让你快速上手,我们将编写一个 HTTP 服务器和客户端的示例。服务器监听本地 8080 端口并返回简单消息,客户端则向服务器发送请求并打印响应。

2.1 HTTP 服务器 Demo

以下是一个简单的 HTTP 服务器实现:

#include "httplib.h"
#include <iostream>int main() {// 创建 HTTP 服务器httplib::Server svr;// 定义根路径的 GET 请求处理svr.Get("/", [](const httplib::Request& req, httplib::Response& res) {res.set_content("Hello, World!", "text/plain");});// 启动服务器,监听 localhost:8080std::cout << "Server started at http://localhost:8080" << std::endl;svr.listen("localhost", 8080);return 0;
}

编译命令

g++ -o server server.cpp -lws2_32

代码说明

  1. httplib::Server 创建服务器实例。
  2. svr.Get 定义了对 / 路径的 GET 请求处理,返回纯文本 “Hello, World!”。
  3. svr.listen 启动服务器,监听指定地址和端口。

2.2 HTTP 客户端 Demo

以下是对应的客户端代码:

#include "httplib.h"
#include <iostream>int main() {// 创建 HTTP 客户端,连接 localhost:8080httplib::Client cli("localhost", 8080);// 发送 GET 请求auto res = cli.Get("/");// 检查并输出响应if (res && res->status == 200) {std::cout << "Response: " << res->body << std::endl;} else {std::cout << "Request failed" << std::endl;}return 0;
}

编译命令

g++ -o client client.cpp -lws2_32

代码说明

  1. httplib::Client 创建客户端实例,指定服务器地址和端口。
  2. cli.Get 发送 GET 请求到 / 路径。
  3. 检查响应对象 res,确保请求成功(状态码 200),并输出响应正文。

2.3 运行 Demo

  1. 打开一个终端,运行服务器:

    ./server
    

    你将看到提示 “Server started at http://localhost:8080”。

  2. 打开另一个终端,运行客户端:

    ./client
    

    客户端将输出 “Response: Hello, World!”。

通过这个 Demo,你已经掌握了 httplib 创建服务器和客户端的基本流程。接下来,我们将深入探讨其高级功能。


3. 深入探讨:高级功能与实际应用

在快速入门中,我们了解了 httplib 的基础用法。现在,我们将探索其高级功能,并展示如何在实际项目中应用这些特性。

3.1 HTTP 服务器高级功能

3.1.1 路由和参数化路径

httplib 支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),并允许为不同路径设置处理函数。以下是一个示例,展示如何处理参数化路径和 POST 请求:

svr.Get("/user/:id", [](const httplib::Request& req, httplib::Response& res) {auto id = req.path_params.at("id"); // 获取路径参数res.set_content("User ID: " + id, "text/plain");
});svr.Post("/submit", [](const httplib::Request& req, httplib::Response& res) {auto data = req.body; // 获取 POST 数据res.set_content("Received: " + data, "text/plain");
});

访问 /user/123 将返回 “User ID: 123”。

3.1.2 静态文件服务

httplib 可以将本地目录映射为静态文件服务。例如:

svr.set_mount_point("/", "./www");

假设 ./www 目录下有 index.html,访问 http://localhost:8080/index.html 将返回该文件内容。

3.1.3 SSL/TLS 支持

要启用 HTTPS,需要使用 httplib::SSLServer 并提供证书和私钥:

httplib::SSLServer svr("cert.pem", "key.pem");
svr.Get("/", [](const httplib::Request& req, httplib::Response& res) {res.set_content("Hello, HTTPS!", "text/plain");
});
svr.listen("localhost", 443);

注意:编译时需链接 OpenSSL 库(-lssl -lcrypto),并确保 MinGW 环境支持 OpenSSL。

3.2 HTTP 客户端高级功能

3.2.1 发送多种请求

客户端支持 GET、POST、PUT、DELETE 等请求。例如:

// POST 请求
auto res = cli.Post("/submit", "data", "text/plain");// PUT 请求
auto res = cli.Put("/update", "new data", "text/plain");// DELETE 请求
auto res = cli.Delete("/delete");
3.2.2 设置请求头

可以通过 httplib::Headers 设置自定义请求头:

httplib::Headers headers = {{"Authorization", "Bearer token"}};
auto res = cli.Get("/", headers);
3.2.3 HTTPS 支持

客户端支持 HTTPS 请求:

httplib::SSLClient cli("localhost", 443);
auto res = cli.Get("/");

同样需要 OpenSSL 支持。

3.3 实际应用场景

3.3.1 RESTful API 服务器

httplib 非常适合构建 RESTful API。例如:

svr.Get("/api/users", [](const httplib::Request& req, httplib::Response& res) {res.set_content("[{\"id\":1,\"name\":\"Alice\"}]", "application/json");
});svr.Post("/api/users", [](const httplib::Request& req, httplib::Response& res) {res.set_content("User created", "text/plain");
});
3.3.2 微服务通信

在微服务架构中,httplib 可用于服务间通信:

// 服务 A(客户端)
httplib::Client cli("service-b", 8080);
auto res = cli.Get("/data");// 服务 B(服务器)
svr.Get("/data", [](const httplib::Request& req, httplib::Response& res) {res.set_content("Data from Service B", "text/plain");
});

4. 总结

通过本教程,你已经全面了解了 C++ httplib 的功能。从基础概念到快速入门 Demo,再到高级功能和实际应用,httplib 展示了其轻量、灵活和强大的特性。在 MinGW 环境下使用时,建议链接 ws2_32 库以确保兼容性(视具体需求而定)。希望这篇教程能帮助你在项目中高效使用 httplib!


以上是修改后的完整教程,去掉了 Winsock 相关内容。如果你还有其他需求或测试中发现新的调整点,请随时告诉我!

相关文章:

【C++】httplib:轻量级的 HTTP 服务器和客户端

本教程采用渐进式讲解方式&#xff0c;适用于 MinGW 环境。我们将从 httplib 的基本概念入手&#xff0c;通过一个小型 Demo 展示其核心用法&#xff0c;最后深入探讨高级功能与实际应用场景。 1. 简介 1.1 httplib 基本概念 httplib 是一个轻量级的 C HTTP 库&#xff0c;设…...

【算法工程】RAG:针对linux下文档解析出现乱码问题的解决

RAG服务中&#xff0c;非常关键的模块是文档解析。但将解析服务部署到linux平台&#xff0c;解析word、ppt等文档时可能就会出现乱码&#xff0c;核心原因是系统未能识别出对应的字体。因为word、ppt在windows下是最适配的&#xff0c;如果将解析服务部署到linux上&#xff0c;…...

亚马逊云科技全面托管DeepSeek-R1模型现已上线

文章目录 亚马逊云科技全面托管DeepSeek-R1模型现已上线在Amazon Bedrock中开始使用DeepSeek-R1模型DeepSeek-R1现已可用 亚马逊云科技全面托管DeepSeek-R1模型现已上线 亚马逊云科技提供众多免费云产品&#xff0c;可以访问&#xff1a;亚马逊云科技 截至1月30日&#xff0c;D…...

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质&#xff1a;缩短首次可见帧渲染时间。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型轻量化部署&#xff0c;减少云端等待。Android&#xff1a;强制启用SplashScreen API&#xff0c;通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...

Docker Compose介绍

基本概念 Docker-Compose是Docker官方的开源项目&#xff0c;负责实现对docker容器集群的快速编排。 可以这么理解&#xff0c;docker compose是docker提出的一个工具软件&#xff0c;可以管理多个docker容器组成一个应用&#xff0c;只需要编写一个YAML格式的配置文件docker…...

openGauss关联列数据类型不一致引起谓词传递失败

今天分享一个比较有意思的案例 注意&#xff1a;因为原始SQL很长&#xff0c;为了方便排版&#xff0c;简化了SQL 下面SQL跑60秒才出结果&#xff0c;客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…...

头歌实践教学平台--【数据库概论】--SQL

一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1&#xff1a;删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2&#xff1a;添加列unitPrice alter t…...

Unity 全栈开发商业级 MMORPG 大型网游:源码与课件助力进阶之路

Unity 全栈开发商业级 MMORPG 大型网游&#xff1a;源码与课件助力进阶之路 在竞争激烈的游戏市场中&#xff0c;大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;凭借其丰富的世界观、庞大的玩家社区以及持续的内容更新&#xff0c;始终占据着重要地位。Unity 作为一…...

软件工程面试题(六)

1、forward及redirect 的区别?有哪些方式实现 <jsp:forward>重定向后url地址栏地址不变还是原来的地址&#xff1b;而response.sendRedirect()重定向后url地址栏地址显示的请求后的新地址。<jsp:forward>重定向的时候可以保存回话信息&#xff0c;因此可以使用re…...

Apache Dubbo 与 ZooKeeper 集成:服务注册与发现的全解析

在分布式系统中&#xff0c;Apache Dubbo 作为一个高性能的 RPC 和微服务框架&#xff0c;广泛用于服务治理&#xff0c;而 ZooKeeper 作为其常用注册中心&#xff0c;提供了服务注册与发现的核心能力。在2025年的技术生态中&#xff0c;理解 Dubbo 与 ZooKeeper 的集成原理和使…...

算法基础——模拟

目录 1 多项式输出 2.蛇形方阵 3.字符串的展开 模拟&#xff0c;顾名思义&#xff0c;就是题⽬让你做什么你就做什么&#xff0c;考察的是将思路转化成代码的代码能⼒。这类题⼀般较为简单&#xff0c;属于竞赛⾥⾯的签到题&#xff08;但是&#xff0c;万事⽆绝对&#xff…...

【第30节】MFC编程:ListCtrl控件和TreeCtrl控件

目录 引言 一、高级控件ListCtrl 二、高级控件TreeCtrl 三、Shell控件 四、CImageList 五、综合代码示例 引言 在MFC编程里&#xff0c;高级控件能大幅提升应用程序的交互性与功能性。接下来&#xff0c;咱们会详细讲讲ListCtrl和TreeCtrl这两个高级控件。不仅会介绍它们…...

kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?

1. inline、noinline、crossinline 的作用 在 Kotlin 里&#xff0c;inline、noinline 和 crossinline 这几个关键字和高阶函数紧密相关&#xff0c;它们能够对高阶函数的行为进行优化和控制。本文接下来会详细介绍它们的作用和原理。 1.1 inline 关键字 inline 关键字用于修…...

JavaScript 手写 call、apply、bind 和 new

1. 手写 call 方法 核心思路&#xff1a;改变函数的 this 指向并立即执行&#xff0c;通过将函数临时挂载到目标对象上调用。 Function.prototype.myCall function (context, ...args) {// 如果 context 为 null 或 undefined&#xff0c;则默认为 windowcontext context |…...

睡眠健康领域的智能硬件设备未来的发展趋势

随着社会节奏的不断加快&#xff0c;人们的睡眠问题愈发多了起来&#xff0c;主要表现有以下几个方面&#xff1a; 睡眠质量下降 浅睡眠增多&#xff1a;现代生活中&#xff0c;人们面临着各种压力源&#xff0c;如工作压力、生活琐事、经济压力等&#xff0c;这些压力会导致大…...

计算机网络基础:量子通信技术在网络中的应用前景

计算机网络基础:量子通信技术在网络中的应用前景 一、前言二、量子通信技术基础2.1 量子通信的基本概念2.2 量子通信的主要原理2.2.1 量子密钥分发(QKD)原理2.2.2 量子隐形传态原理三、量子通信技术的特点3.1 绝对安全性3.2 超高通信速率潜力3.3 抗干扰能力强四、量子通信技…...

Postman 下载文件指南:如何请求 Excel/PDF 文件?

在 Postman 中进行 Excel/PDF 文件的请求下载和导出&#xff0c;以下是简明的步骤&#xff0c;帮助你轻松完成任务。首先&#xff0c;我们将从新建接口开始&#xff0c;逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程...

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…...

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…...

安装node,配置npm, yarn, pnpm, bun

文章目录 安装node, 配置 npm, yarn, pnpm, bun配置node配置 npm, yarn, pnpm, bunnpmyarnpnpmbun 安装node, 配置 npm, yarn, pnpm, bun 配置node ​ 输入网址&#xff1a;Node.js&#xff0c;包含各种安装方式以及多版本管理方式。也可以直接下载安装包。 安装包的安装过程…...

redis部署架构

一.redis多实例 如上图所示&#xff0c;我们经常使用实例的端口号来作为实例的安装目录名称。 1.创建实例安装目录 如上图所示&#xff0c;这是创建实例的安装目录&#xff0c; 2.拷贝实例的配置文件 如上图所示&#xff0c;将redis解压目录下的配置文件拷贝到对应的conf目录…...

深入理解指针(4)(C语言版)

文章目录 前言一、回调函数是什么&#xff08;一&#xff09;定义&#xff08;二&#xff09;工作原理&#xff08;三&#xff09;应用场景 二、qsort举例&#xff08;一&#xff09;qsort函数简介&#xff08;二&#xff09;比较函数的定义&#xff08;三&#xff09;使用示例…...

【HTML】验证与调试工具

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…...

【Mysql】SQL 优化全解析

文章目录 一、理解执行计划​1.1 执行计划的作用​1.2 查看执行计划​ 二、查询优化​2.1 避免全表扫描​2.2 使用覆盖索引​2.3 合理使用 JOIN​ 三、索引优化​3.1 索引设计原则​3.2 索引维护​ 在数据驱动的当今时代&#xff0c;MySQL 作为应用广泛的开源关系型数据库&…...

​​SenseGlove与Aeon Robotics携手推出HEART项目,助力机器人培训迈向新台阶

在自动化和机器人技术快速发展的今天&#xff0c;SenseGlove和Aeon Robotics联合推出了一项创新项目——HEART项目。该项目在欧盟资助的MasterXR框架内展开&#xff0c;旨在通过整合虚拟现实&#xff08;VR&#xff09;、力反馈触觉手套&#xff08;SenseGlove项目Rembrandt&am…...

mapbox进阶,仿照百度,加载marker点位,移入marker点切换图标,点击展示气泡,气泡和marker联动

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️marker 标注点位 api1.3.1 ☘️构造函数…...

使用HTML5和CSS3实现3D旋转相册效果

使用HTML5和CSS3实现3D旋转相册效果 这里写目录标题 使用HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现思路1. HTML结构2. CSS样式解析2.1 基础样式设置2.2 3D效果核心样式2.3 卡片样式 3. JavaScript交互实现3.1 旋转控制3.2 自动播放功能 技术要点总结项目亮点总…...

HTML5 新的 Input 类型学习笔记

HTML5 引入了多种新的表单输入类型&#xff0c;这些新特性不仅增强了输入控制&#xff0c;还提供了更强大的验证功能&#xff0c;使表单设计更加灵活和便捷。以下是 HTML5 新的 Input 类型的详细学习笔记。 一、color 类型 功能&#xff1a;用于选取颜色。 使用场景&#xff…...

游戏引擎学习第186天

回顾并规划今天的任务 现在&#xff0c;我们站在了一个关键的时刻&#xff0c;准备突破&#xff0c;拥有一些优秀的性能分析代码。从目前来看&#xff0c;我们已经能够看到时间的消耗情况&#xff0c;我对这一点感到非常兴奋。昨天的直播中我们勉强让一些东西工作了&#xff0…...

NDK CMake工程中引入其他C++三方库

在Android NDK CMake工程中引入其他C三方库时&#xff0c;有以下几种常见的依赖方式&#xff1a; 1. 源码依赖 如果三方库的源代码包含在你的项目目录中&#xff0c;并且它有自己的CMake配置&#xff0c;可以使用add_subdirectory将三方库的构建过程集成到你的项目中。 示例…...