当前位置: 首页 > 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功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。

相关文章:

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

目录 引言 一. httplib库概述 二. httplib核心组件 2.1 数据结构 2.2 类和函数 2.3 服务器搭建 ​编辑 结语 引言 在现代软件开发中&#xff0c;HTTP服务是网络应用的基础。对于需要快速搭建HTTP服务器或客户端的场景&#xff0c;使用成熟的第三方库可以极大提高开发效…...

基于嵌入式C++、SQLite、MQTT、Modbus和Web技术的工业物联网网关:从边缘计算到云端集成的全栈解决方案设计与实现

一、项目概述 1.1 项目目标与用途 随着工业4.0时代的到来&#xff0c;传统工业设备与现代信息技术的结合越来越紧密。物联网工业网关作为连接工业设备与云端平台的桥梁&#xff0c;在工业自动化、设备监控、远程运维等方面发挥着至关重要的作用。本项目旨在设计并实现一个能够…...

Chapter 38 设计模式

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、单例模式二、工厂模式 前言 在软件开发中&#xff0c;设计模式提供了一种可重用的解决方案&#xff0c;以应对在特定环境中反复出现的问题。这些模式是基于经验总结…...

Redis5主备安装-Redis

本次Redis有两台服务器及3个独立IP&#xff1a;主服务器的ip地址是192.168.31.190&#xff0c;从服务器的IP地址是192.168.31.191&#xff0c;vipIP地址是192.168.31.216 主备方案承载Redis最大的好处是无需考虑Redis崩后无法访问。 前提是需要优先安装keepalived&#xff0c;…...

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…...

pytest.ini介绍

1.pytest.ini是什么 &#xff1f; pytest.ini文件是pytest的主配置文件&#xff1b;pytest.ini文件的位置一般放在项目的根目录下&#xff0c;不能随便放&#xff0c;也不能更改名字。在pytest.ini文件中都是存放的一些配置选项 &#xff0c;这些选项都可以通过pytest -h查看到…...

Vue项目打包成桌面应用

Vue项目打包成桌面应用 一、使用 NW.js 打包 NW.js基于Chromium和Node.js。它允许您直接从浏览器调用Node.js代码和模块&#xff0c;并在应用程序中使用Web技术。此外&#xff0c;您可以轻松地将web应用程序打包为本机应用程序。 NW官网...

DEFAULT_JOURNAL_IOPRIO

/* * 这些是 CFQ&#xff08;完全公平排队&#xff09;实现的 I/O 优先级组。 RT 是实时类&#xff0c;它总是能获得优质服务。 BE 是尽力而为的调度类&#xff0c;是任何进程的默认类别。 IDLE 是空闲调度类&#xff0c;只有在没有其他人使用磁盘时才会被服务。 */ /* *…...

【阿卡迈防护分析】Vueling航空Akamai破盾实战

文章目录 1. 写在前面2. 风控分析3. 破盾实战 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇&#xff0c;旨在通过动手实践&#xff0c;帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章&#xff0c;大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧&#xff01; 介绍 什么是Amazon Rekognition&…...

如何获取VS Code扩展的版本更新信息

获取VS Code 扩展的版本更新的需求 因为企业内部有架设私有扩展管理器的要求&#xff0c;但是对于一些官方市场的插件&#xff0c;希望可以自动获取这些扩展的更新并上传至私有扩展管理器。于是就有了本篇介绍的需求&#xff1a; 通过API的方式获取VS Code 扩展的更新。 关于…...

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包&#xff0c;提供了丰富的功能和简洁易用的界面&#xff0c;使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸&#xff0c;勾选多人脸模式即可 人脸替换 高清修复自…...

day04--js的综合案例

1.1 商品全选 需求&#xff1a;商品全选 1. 全选 &#xff1a;点击全选按钮,所有复选框都被选中 2. 全不选 &#xff1a;点击全不选按钮,所有复选框都被取消选中 3. 反选 &#xff1a; 点击反选按钮,所有复选框状态取反 <!DOCTYPE html> <html lang"en">…...

【产品经理】定价策略

年初的时候&#xff0c;尝试自己独立运营了一个美团店铺&#xff0c;最终没有继续做下去了&#xff0c;原因是利润率太低&#xff0c;平台和骑手把利润拿走太多了&#xff0c;根本没有钱赚&#xff0c;烧钱搞流量更是深不见底。 不过也学到了很多东西&#xff0c;比如选品策略…...

webrtc学习笔记3

Nodejs实战 对于我们WebRTC项目而言&#xff0c;nodejs主要是实现信令服务器的功能&#xff0c;客户端和服务器端的交互我们选择websocket作为通信协议&#xff0c;所以以websocket的使用为主。 web客户端 websocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行…...

Transformer架构;Encoder-Decoder;Padding Mask;Sequence Mask;

目录 Transformer架构 Transformer架构的主要组成部分: 简单举例说明输入和输出: Encoder-Decoder 编码器/解码器组成 6、位置前馈网络(Position-wise Feed-Forward Networks) 7、残差连接和层归一化 10、掩码Mask 10.1 Padding Mask 10.2 Sequence Mask 为什么…...

【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)

前缀和的优势 给定一个数组&#xff0c;前缀和的特点在于&#xff0c;任意给出一对始末位置&#xff0c;能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。 题型分析 这道题目正是“给出始末位置&#xff0c;检测其中元素特点”那一类&#xff0c;那我们就想&#…...

SQL每日一练-0814

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 找出每个部门中薪资最高的员工显示部门ID、部门名称、员工ID、员工姓名以及对应的薪资 2、表和虚拟数据 现有两个表&#xff1a;Employees 和 Departments&#xff0c;记录了员工和部门信息。…...

Android持久化技术—文件存储

Android持久化技术—文件存储 文件存储是Android中最基本的一种数据存储方式&#xff0c;它不对存储的内容进行任何的格式化处理&#xff0c;所有数据都是原封不动地保存到文件当中的&#xff0c;因而它比较适合用于存储一些简单的文本数据或二进制数据。如果你想使用文件存储…...

动手学深度学习(pytorch)学习记录12-激活函数[学习记录]

激活函数 激活函数&#xff08;activation function&#xff09;通过计算加权和并加上偏置来确定神经元是否应该被激活&#xff0c; 它们将输入信号转换为输出的可微运算。 import torch import matplotlib.pyplot as plt 简单定义一个画图的函数 def graph_drawing(x_,y_…...

2026保姆级教程:免费一键去图片水印的App有哪些?这几种方法一看就会

你是不是也遇到过这种抓狂的时刻&#xff1f;好不容易在网上找到一张绝美壁纸或实用素材&#xff0c;保存下来一看&#xff0c;角落那个水印直接毁掉了整张图的氛围。更气人的是&#xff0c;你尝试用相册自带的编辑功能去涂抹&#xff0c;结果越涂越糊&#xff0c;最后只能无奈…...

技术人的沟通技巧:如何与非技术人员有效沟通

技术人的沟通技巧&#xff1a;如何与非技术人员有效沟通 引言 作为一名技术人&#xff0c;我们不仅需要具备扎实的技术能力&#xff0c;还需要具备良好的沟通能力。特别是当我们需要与非技术人员沟通时&#xff0c;如何将复杂的技术问题用简单易懂的语言表达出来&#xff0c;是…...

Hermes Agent用户指南通过Taotoken自定义供应商接入大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent用户指南&#xff1a;通过Taotoken自定义供应商接入大模型 本文面向使用Hermes Agent框架的开发者&#xff0c;详细说…...

化学教学平台——数据可视化与电化学AI动画推演

化学教学平台——数据可视化与电化学AI动画推演 1 项目概述 本化学教学平台是一套完整的前端Web应用,旨在为化学教育工作者和学生提供两个核心功能模块:数据智能查询与化学性质可视化(基于ECharts和D3.js),以及反应模拟预判——基于电化学原理的AI动画推演(基于Three.j…...

5分钟实现Windows三指拖拽:macOS手势体验的终极解决方案

5分钟实现Windows三指拖拽&#xff1a;macOS手势体验的终极解决方案 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDrag…...

如何在VSCode中快速配置专业级R语言开发环境:终极实战指南

如何在VSCode中快速配置专业级R语言开发环境&#xff1a;终极实战指南 【免费下载链接】vscode-R R Extension for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-R 你是否正在寻找一个现代化的R语言开发环境&#xff0c;能够提供智能代码补全…...

观测对比,接入 Taotoken 前后 API 调用的平均延迟与成功率变化

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观测对比&#xff0c;接入 Taotoken 前后 API 调用的平均延迟与成功率变化 作为一个技术团队的负责人&#xff0c;在引入新的技术组…...

利用Taotoken模型广场为你的智能客服场景选择合适的大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken模型广场为你的智能客服场景选择合适的大模型 构建智能客服系统时&#xff0c;一个核心决策是选择合适的大语言模型。…...

为Hermes Agent配置自定义供应商并接入Taotoken聚合服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Hermes Agent配置自定义供应商并接入Taotoken聚合服务 Hermes Agent 是一个流行的智能体开发框架&#xff0c;它支持通过配置不同…...

深度解析miniblink49浏览器内核架构设计与企业级打印功能实现原理

深度解析miniblink49浏览器内核架构设计与企业级打印功能实现原理 【免费下载链接】miniblink49 a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核&#xff0c;用来取代wke和libcef 项目地址: https://gitcode.com/…...