cpp-httplib库的基本使用及文件上传下载技术分析

科技   2024-11-28 14:09   上海  

cpp-httplib是一个轻量级的C++ HTTP客户端/服务器库,它提供了简单易用的API来创建HTTP服务器和客户端。cpp-httplib具有以下特点:

  1. 轻量级:cpp-httplib的设计目标是简单和轻量,只有一个头文件包含即可,不依赖于任何外部库。
  2. 跨平台:支持多种操作系统,包括Windows、Linux、MacOS。
  3. 支持HTTP/1.1:实现了HTTP/1.1协议,包括持久连接和管道化。
  4. Multipart form-data:支持发送和接收multipart/form-data类型的请求,这对于文件上传非常有用。
  5. SSL/TLS:通过使用OpenSSL或mbedTLS库,cpp-httplib支持HTTPS和WSS。
  6. 简单易用:API设计简洁,易于学习和使用。
  7. 性能良好:适合多种应用场景。

cpp-httplib库的基本使用可以分为以下几个部分:

一、安装与配置

cpp-httplib的安装非常简单,可以通过克隆GitHub上的库到本地项目中使用:

git clone https://github.com/yhirose/cpp-httplib.git

httplib.h头文件包含到项目中即可开始使用。

二、HTTP服务器的基本使用

  1. 实例化服务器对象
#include "httplib.h"

int main() {
    httplib::Server svr;
    // 其他代码...
    return 0;
}
  1. 注册回调函数
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;
});
  1. 启动服务器
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客户端的基本使用

  1. 实例化客户端对象
httplib::Client cli("127.0.0.1"9000);
  1. 发送请求
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对象流式读取文件内容。

  1. 服务端代码
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");
    }
});
  1. 客户端代码
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请求实现,服务器在响应中返回文件内容。

  1. 服务端代码(提供文件下载):
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");
    }
});
  1. 客户端代码(下载文件):
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请求处理、文件上传和下载等功能。


Qt教程
致力于Qt教程,Qt技术交流,研发
 最新文章