目录
[一. 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
搭建服务器通常包括以下步骤:
- 创建
Server
对象。- 设置静态资源目录(如果需要)。
- 添加请求处理函数映射。
- 启动服务器监听。
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
功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。