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;    // 存放头部字段的键值对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. 启动服务器监听。
#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功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。

PointPillars是一种基于点云的目标检测算法,其主要应用于自动驾驶领域。该算法的核心思想是将点云数据转换为三维网格数据,并使用卷积神经网络(CNN)来检测目标。相比于传统的基于图像的目标检测算法,PointPillars在保留场景空间信息的同时,大幅提高了目标检测的准确度和效率。 具体来说,PointPillars的算法流程如下:首先,将点云数据转换为三维网格数据,然后使用CNN对每个网格进行分类并预测目标的边界框。最后,通过非极大值抑制(NMS)算法来筛选出最终的目标检测结果。在该算法中,点云的密度以及对边界框的准确度影响较为显著,因此PointPillars通过密集采样和点云旋转等方法优化了点云数据的输入。 相比于基于图像的目标检测算法,PointPillars的优势主要体现在以下方面:首先,该算法能够准确地捕捉目标的三维空间信息,可以有效地解决目标遮挡或者遮挡较多的情况;其次,该算法的检测效率较高,可以实现实时检测,并且其能够在运行过程中进行端到端的训练和优化;最后,该算法具有较强的鲁棒性和泛化能力,可以适应不同场景下的目标检测需求。 总之,PointPillars作为新兴的目标检测算法之一,具有较高的应用潜力和研究价值,其可以改善自动驾驶等领域的目标检测能力,并促进相关技术的进一步发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值