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

目录

引言

[一. httplib库概述](#一. httplib库概述)

[二. httplib核心组件](#二. httplib核心组件)

[2.1 数据结构](#2.1 数据结构)

[2.2 类和函数](#2.2 类和函数)

[2.3 服务器搭建](#2.3 服务器搭建)

​编辑

结语


引言

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

一. httplib库概述

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

二. httplib核心组件

cpp 复制代码
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;    // 存放头部字段的键值对map
        std::string body;   // 存放请求正⽂
        // for server
        std::string version;        // 存放协议版本
        
        Params params;              // 存放url中查询字符串 key=val&key=val的 键值对map

        MultipartFormDataMap 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;                                                          // 存放响应头部字段键值对的map

        std::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. 启动服务器监听。
cpp 复制代码
#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功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。

相关推荐
ZStack开发者社区14 分钟前
青海交科携手云轴科技ZStack为青海交控集团打造智慧物流大数据平台
大数据·服务器·科技·云计算·gpu算力
xiaoduo AI1 小时前
智能客服机器人能精准预判用户疑问提前主动应答吗?能大幅缩短客户咨询沟通时长吗?
运维·服务器·机器人
悲伤小伞1 小时前
Linux_传输层协议TCP详解
linux·网络·c++·网络协议·tcp/ip
勤劳的进取家1 小时前
服务器文件交互方式
运维·服务器·microsoft
偷懒下载原神1 小时前
【网络编程】UDP协议
网络·网络协议·udp
yyuuuzz1 小时前
aws亚马逊云上部署常见问题梳理
运维·服务器·网络·数据库·云计算·aws
wanhengidc1 小时前
算力服务器的优势都有哪些?
大数据·运维·服务器·网络·人工智能·安全·智能手机
一直有一个ac的梦想2 小时前
cmu15445 2025fall lec15 query optimiaztion Pt1
java·服务器·数据库
曹瑞曹瑞2 小时前
onlyoffice部署中https与http冲突的原因思考
http·https·onlyoffice
xingyuzhisuan2 小时前
风冷还是水冷?RTX 4090服务器散热方案对比
运维·服务器·ai·gpu算力