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

httplib库:用C++11搭建轻量级HTTP服务器

目录

引言

一. httplib库概述

二. httplib核心组件

2.1 数据结构

2.2 类和函数

2.3 服务器搭建

​编辑

结语


引言

在现代软件开发中,HTTP服务是网络应用的基础。对于需要快速搭建HTTP服务器或客户端的场景,使用成熟的第三方库可以极大提高开发效率。本文将详细介绍httplib——一个C++11单文件头的跨平台HTTP/HTTPS库,以及如何使用它搭建一个简单的HTTP服务器。

一. httplib库概述

httplib是一个用C++编写的轻量级库,它提供了创建HTTP服务器和客户端的基本功能。由于它是一个单文件头库,集成起来非常方便,只需包含httplib.h在你的代码中即可。

二. httplib核心组件

namespace httplib
{struct MultipartFormData{std::string name;std::string content;std::string filename;std::string content_type;};using MultipartFormDataItems = std::vector<MultipartFormData>;struct Request{std::string method; // 存放请求⽅法std::string path;   // 存放请求资源路径Headers headers;    // 存放头部字段的键值对mapstd::string body;   // 存放请求正⽂// for serverstd::string version;        // 存放协议版本Params params;              // 存放url中查询字符串 key=val&key=val的 键值对mapMultipartFormDataMap files; // 存放⽂件上传时,正⽂中的⽂件信息Ranges ranges;bool has_header(const char *key) const;                             // 判断是否有某个头部字段std::string get_header_value(const char *key, size_t id = 0) const; // 获取头部字段值void set_header(const char *key, const char *val);       // 设置头部字段bool has_file(const char *key) const;                    // ⽂件上传中判断是否有某个⽂件的信息MultipartFormData get_file_value(const char *key) const; // 获取指定的⽂件信息};struct Response{std::string version; // 存放协议版本int status = -1;     // 存放响应状态码std::string reason;Headers headers;                                                          // 存放响应头部字段键值对的mapstd::string body;                                                         // 存放响应正⽂std::string location;                                                     // Redirect location重定向位置void set_header(const char *key, const char *val);                        // 添加头部字段到headers中 void set_content(const std::string &s, const char *content_type);      // 添加正⽂到body中 void set_redirect(const std::string &url, int status = 302); // 设置全套的重定向信息};class Server{using Handler = std::function<void(const Request &, Response &)>; // 函数指针类型using Handlers = std::vector<std::pair<std::regex, Handler>>; // 存放请求-处理函数映射std::function<TaskQueue *(void)> new_task_queue;          // 线程池Server &Get(const std::string &pattern, Handler handler); // 添加指定GET⽅法的处理映射Server &Post(const std::string &pattern, Handler handler);Server &Put(const std::string &pattern, Handler handler);Server &Patch(const std::string &pattern, Handler handler);Server &Delete(const std::string &pattern, Handler handler);Server &Options(const std::string &pattern, Handler handler);bool listen(const char *host, int port, int socket_flags = 0); // 开始服务器监听bool set_mount_point(const std::string &mount_point, const std::string &dir,Headers headers = Headers()); // 设置http服务器静态资源根⽬录};
}

2.1 数据结构

  • MultipartFormData:用于处理文件上传的表单数据。
  • Request:代表入站请求,包含请求方法、路径、头部字段、请求正文等。
  • Response:代表出站响应,包含协议版本、状态码、头部字段、响应正文等。

2.2 类和函数

  • Server:代表HTTP服务器,可以设置路由、处理请求、启动监听等。
  • Handlers:用于存储请求处理器映射,方便添加请求处理逻辑。

2.3 服务器搭建

使用httplib搭建服务器通常包括以下步骤:

  1. 创建Server对象。
  2. 设置静态资源目录(如果需要)。
  3. 添加请求处理函数映射。
  4. 启动服务器监听。
#include "httplib.h"int main(void) {using namespace httplib;Server svr;// 设置静态资源目录auto ret = svr.set_mount_point("/", "./www");if (!ret) {std::cerr << "Failed to set mount point" << std::endl;return -1;}// 添加GET请求处理函数svr.Get("/hi", [](const Request& req, Response& res) {res.set_content("Hello World!", "text/plain");});// 添加GET请求处理函数,支持正则匹配svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) {auto numbers = req.matches[1];res.set_content(numbers, "text/plain");});// 添加POST请求处理函数,处理文件上传svr.Post("/multipart", [&](const auto& req, auto& res) {auto size = req.files.size();if (req.has_file("file1")) {const auto& file = req.get_file_value("file1");std::cout << file.filename << std::endl;std::cout << file.content_type << std::endl;std::cout << file.content << std::endl;}});// 启动服务器监听svr.listen("0.0.0.0", 9090);return 0;
}

运行结果

结语

httplib库为C++开发者提供了一个快速搭建HTTP服务器的解决方案。通过本文的介绍和示例代码,你应该能够理解如何使用httplib创建HTTP服务,并处理基本的HTTP请求。虽然httplib功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP获取和操作配置文件php.ini的几个函数介绍
  • 【源码+文档+调试讲解】多媒体信息共享平台
  • 大型、复杂、逼真的安全服和安全帽检测:SFCHD数据集和SCALE方法
  • 内存泄漏之VLD可以检测哪些类型的内存泄漏?
  • 【人工智能】助力音乐产业
  • Android之内容提供者(ContentProvider)
  • 算法力扣刷题记录 八十三【96.不同的二叉搜索树】
  • 鼠标手势软件,效率办公必备!移动鼠标即可执行命令
  • 个人效能是一个系统
  • Redis 缓存预热、雪崩、穿透、击穿
  • 坐牢第二十七天(聊天室)
  • [游戏开发] LuaTable转string存读二进制文件
  • vue 后台管理 之 axios使用及接口拦截响应等
  • 基于神经网络逆同步控制方法的两变频调速电机控制系统matlab仿真
  • Linux git安装与部署
  • @angular/forms 源码解析之双向绑定
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 2017-08-04 前端日报
  • CentOS从零开始部署Nodejs项目
  • ES6 ...操作符
  • IDEA 插件开发入门教程
  • leetcode388. Longest Absolute File Path
  • Mac转Windows的拯救指南
  • Nacos系列:Nacos的Java SDK使用
  • Netty 4.1 源代码学习:线程模型
  • October CMS - 快速入门 9 Images And Galleries
  • ReactNativeweexDeviceOne对比
  • Spring声明式事务管理之一:五大属性分析
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • v-if和v-for连用出现的问题
  • Vue2.x学习三:事件处理生命周期钩子
  • 包装类对象
  • 构建二叉树进行数值数组的去重及优化
  • 后端_MYSQL
  • 收藏好这篇,别再只说“数据劫持”了
  • 数组的操作
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • $(selector).each()和$.each()的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (pojstep1.3.1)1017(构造法模拟)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (笔试题)合法字符串
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (六)Hibernate的二级缓存
  • (十八)Flink CEP 详解
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *p++,*(p++),*++p,(*p)++区别?
  • .apk 成为历史!
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?