cpp-httplib是一个轻量级的C++ HTTP客户端/服务器库,它提供了简单易用的API来创建HTTP服务器和客户端。cpp-httplib具有以下特点:
轻量级:cpp-httplib的设计目标是简单和轻量,只有一个头文件包含即可,不依赖于任何外部库。 跨平台:支持多种操作系统,包括Windows、Linux、MacOS。 支持HTTP/1.1:实现了HTTP/1.1协议,包括持久连接和管道化。 Multipart form-data:支持发送和接收multipart/form-data类型的请求,这对于文件上传非常有用。 SSL/TLS:通过使用OpenSSL或mbedTLS库,cpp-httplib支持HTTPS和WSS。 简单易用:API设计简洁,易于学习和使用。 性能良好:适合多种应用场景。
cpp-httplib库的基本使用可以分为以下几个部分:
一、安装与配置
cpp-httplib的安装非常简单,可以通过克隆GitHub上的库到本地项目中使用:
git clone https://github.com/yhirose/cpp-httplib.git
将httplib.h
头文件包含到项目中即可开始使用。
二、HTTP服务器的基本使用
实例化服务器对象:
#include "httplib.h"
int main() {
httplib::Server svr;
// 其他代码...
return 0;
}
注册回调函数:
svr.Get("/SnowK", [](const httplib::Request& req, httplib::Response& resp) {
std::cout << req.method << std::endl;
std::cout << req.path << std::endl;
for (auto& iter : req.headers) {
std::cout << iter.first << ": " << iter.second << std::endl;
}
std::string body("<html><body><h1>Hello SnowK</h1><body><html>");
resp.set_content(body, "text/html");
resp.status = 200;
});
启动服务器:
svr.listen("0.0.0.0", 9200);
完整的服务器示例如下:
#include "httplib.h"
int main() {
httplib::Server svr;
svr.Get("/SnowK", [](const httplib::Request& req, httplib::Response& resp) {
std::cout << req.method << std::endl;
std::cout << req.path << std::endl;
for (auto& iter : req.headers) {
std::cout << iter.first << ": " << iter.second << std::endl;
}
std::string body("<html><body><h1>Hello SnowK</h1><body><html>");
resp.set_content(body, "text/html");
resp.status = 200;
});
svr.listen("0.0.0.0", 9200);
return 0;
}
三、HTTP客户端的基本使用
实例化客户端对象:
httplib::Client cli("127.0.0.1", 9000);
发送请求:
auto result = cli.Get("/");
std::cout << result->status << std::endl;
std::cout << result->body << std::endl;
完整的客户端示例如下:
#include "httplib.h"
int main() {
httplib::Client cli("127.0.0.1", 9000);
auto result = cli.Get("/");
std::cout << result->status << std::endl;
std::cout << result->body << std::endl;
return 0;
}
四、文件上传与下载
文件上传
cpp-httplib支持multipart/form-data类型的请求,这对于文件上传非常有用。服务端可以通过Request
对象的is_multipart_form_data()
方法检查请求是否为multipart/form-data类型,并通过ContentReader
对象流式读取文件内容。
服务端代码:
svr.Post("/upload", [](const httplib::Request& req, httplib::Response& res, const httplib::ContentReader& content_reader) {
if (req.is_multipart_form_data()) {
httplib::MultipartFormDataItems files;
content_reader([&files](const httplib::MultipartFormData& file) {
files.push_back(file);
std::cerr << "Uploaded file: " << file.filename << std::endl;
return true;
}, [&](const char* data, size_t data_length) {
files.back().content.append(data, data_length);
return true;
});
// 处理上传的文件
// ...
res.set_content("File uploaded successfully", "text/plain");
} else {
res.status = 400;
res.set_content("Invalid request", "text/plain");
}
});
客户端代码:
httplib::MultipartFormDataItems items = {
{"file", "example.txt", "text/plain", "This is an example file content"}
};
auto res = cli.Post("/upload", items, "multipart/form-data");
std::cout << res->status << std::endl;
std::cout << res->body << std::endl;
文件下载
文件下载可以通过HTTP GET请求实现,服务器在响应中返回文件内容。
服务端代码(提供文件下载):
svr.Get("/download", [](const httplib::Request& req, httplib::Response& res) {
std::ifstream file("example.txt", std::ios::binary);
if (file.is_open()) {
std::ostringstream oss;
oss << file.rdbuf();
std::string file_content = oss.str();
res.set_content(file_content, "text/plain");
res.set_header("Content-Disposition", "attachment; filename=example.txt");
} else {
res.status = 404;
res.set_content("File not found", "text/plain");
}
});
客户端代码(下载文件):
auto res = cli.Get("/download");
if (res && res->status == 200) {
std::ofstream file("downloaded_example.txt", std::ios::binary);
file << res->body;
file.close();
std::cout << "File downloaded successfully" << std::endl;
} else {
std::cerr << "Failed to download file" << std::endl;
}
总结
cpp-httplib是一个轻量级、跨平台的C++ HTTP/HTTPS网络库,提供了简单易用的API来创建HTTP服务器和客户端。通过本文的介绍和代码示例,您可以快速上手cpp-httplib库,并实现基本的HTTP请求处理、文件上传和下载等功能。