高效轻量的C++ HTTP服务:cpp-httplib使用指南

文章目录

httplib介绍与安装

C++ HTTP 库(cpp-httplib)是一个轻量级的 C++ HTTP 客户端/服务器库,它提供了简单的 API 来创建 HTTP 服务器和客户端,支持同步和异步操作。以下是一些关于cpp-httplib 的主要特点:

1.轻量级:cpp-httplib 的设计目标是简单和轻量,只有一个头文件包含即可,不依赖于任何外部库。

2.跨平台:它支持多种操作系统,包括 Windows、Linux 和 macOS。

3.同步和异步操作:库提供了同步和异步两种操作方式,允许开发者根据需要选择。

4.支持 HTTP/1.1:它实现了 HTTP/1.1 协议,包括持久连接和管道化。

5.Multipart form-data:支持发送和接收 multipart/form-data 类型的请求,这对于文件上传非常有用。

6.SSL/TLS 支持:通过使用 OpenSSL 或 mbedTLS 库,cpp-httplib 支持 HTTPS 和 WSS。

7.简单易用:API 设计简洁,易于学习和使用。

8.性能:尽管是轻量级库,但性能表现良好,适合多种应用场景。

9.社区活跃:cpp-httplib 有一个活跃的社区,不断有新的功能和改进被加入。

安装

bash 复制代码
git clone https://github.com/yhirose/cpp-httplib.git

接口介绍

请求中包含请求方法,请求的资源路径,请求头部,请求正文和查询字符串。

cpp 复制代码
struct Request
{
    std::string method;
    std::string path;
    Headers headers;
    std::string body;
    Params params;
};

响应中包含HTTP协议版本,响应状态码,响应状态码描述,响应头部,响应正文。

cpp 复制代码
struct Response
{
    std::string version;
    int status = -1;
    std::string reason;
    Headers headers;
    std::string body;
    void set_content(const std::string &s,const std::string &content_type);
    void set_header(const std::string &key,const std::string &val);
};   

服务器句柄,通过GET/POST/PUT/DELETE函数处理对应的HTTP请求,设置请求路径和对应的回调函数即可,通过listen函数进行对应端口的监听。

cpp 复制代码
class Server
{
    using Handler = std::function<void(const Request&, Response&)>;
    Server &Get(const std::string &pattern, Handler handler);
    Server &Post(const std::string &pattern, Handler handler);
    Server &Put(const std::string &pattern, Handler handler);
    Server &Delete(const std::string &pattern, Handler handler);
    bool listen(const std::string &host, int port);
};

客户端句柄同样也是GET/POST/PUT/DELETE发起对应的请求,参数为请求路径,请求正文和请求的类型。

cpp 复制代码
class Client
{
    explicit Client(const std::string &host, int port);
    Result Get(const std::string &path, const Headers &headers);
    Result Post(const std::string &path, const std::string &body,
                const std::string &content_type);
    Result Put(const std::string &path, const std::string &body,
               const std::string &content_type);
    Result Delete(const std::string &path, const std::string &body,
                  const std::string &content_type);
};

使用案例

main.cc

cpp 复制代码
#include "../common/httplib.h"
#include <iostream>

int main()
{
    httplib::Server server;

    // using Handler = std::function<void(const Request &, Response &)>;
    server.Get("/hello",[](const httplib::Request & req, httplib::Response & resp)
    {
        std::cout << "method: " << req.method << std::endl;
        std::cout << "path: " << req.path << std::endl;

        std::string body = "<html><body><h1>Hello World</h1></body></html>";
        resp.set_content(body,"text/html");
        resp.status = 200;
    });

    server.listen("0.0.0.0",8080);
    return 0;
}

makefile

makefile 复制代码
main:main.cc
	g++ -o $@ $^ -std=c++17 -lpthread

.PHONY:clean
clean:
	rm -rf main
复制代码
makefile

```makefile
main:main.cc
	g++ -o $@ $^ -std=c++17 -lpthread

.PHONY:clean
clean:
	rm -rf main
相关推荐
虹科网络安全4 小时前
解读CRA横向标准EN 40000系列:从法规文本到工程落地 | CRA合规之路(七)
网络·安全·web安全
huainingning5 小时前
华三防火墙web界面ipsec配置
网络
阿里云云原生8 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能
kisloy9 小时前
【爬虫入门第13讲】Scrapy 框架深度解析(四)核心配置与自定义扩展
网络·爬虫·scrapy
夜雪一千10 小时前
TCP数据包长什么样?拆解TCP报文头部结构
网络·网络协议·tcp/ip
德迅云安全杨德俊11 小时前
应用加速:一站式解决企业跨域网络加速与安全双重难题
网络·安全·ddos
瓦学妹11 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
别催小唐敲代码12 小时前
STM32 I2C协议详解:从原理到实战
stm32·网络协议·协议
for_ever_love__13 小时前
iOS:网络请求再学习
网络·学习·ios·objective-c
一名普通的电源工程师14 小时前
E0512XT-1WR3 适配优选 钡特电源 DF1-05D12XT|1W 隔离5V转±12V模块电源选型参数技术解析
大数据·网络·人工智能