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

相关推荐
进阶的猪4 分钟前
使用printk对SPI子系统全过程的追踪
linux·服务器
2301_8035545214 分钟前
Linux里面的文件描述符和windows里面的句柄
linux·运维·服务器
KnowSafe2 小时前
证书自动化解决方案哪家更可靠?
运维·服务器·安全·https·自动化·ssl
日取其半万世不竭2 小时前
用云服务器搭建 Nextcloud,告别网盘限速和隐私泄露
运维·服务器
wanhengidc2 小时前
可持续性 云手机运行
运维·服务器·网络·安全·智能手机
王琦03182 小时前
第二章 chrony服务器
运维·服务器
mifengxing2 小时前
操作系统(四)
linux·服务器·网络·操作系统
先知后行。2 小时前
Linux 内核驱动 —— 锁机制
linux·运维·服务器
技术钱2 小时前
OutputParser输出解析器
linux·服务器·前端·python
先知后行。3 小时前
Liunx驱动 IO 模型
linux·运维·服务器