通过C++发布一个web api服务器,其实没有想象的难,一个库就够了

发布时间 2023-12-15 07:43:54作者: 架构师老卢

 

为了实现一个包含静态文件输出、GET、POST 请求处理(含参数读取)、文件上传和下载功能的 Web API 服务,我们将使用 cpp-httplib 作为 HTTP 服务器库。首先,确保你已经安装了该库。

git clone https://github.com/yhirose/cpp-httplib.git
cd cpp-httplib
mkdir build
cd build
cmake ..
make
sudo make install

下面是一个简单的示例代码,演示如何使用 cpp-httplib 创建一个包含上述功能的 Web API 服务。

#include <httplib.h>
#include <iostream>

using namespace httplib;

int main() {
    // 创建 HTTP 服务器实例
    Server svr;

    // 处理静态文件请求,将当前目录下的 "static" 文件夹作为静态文件根目录
    svr.set_base_dir("./static");

    // 处理 GET 请求
    svr.Get("/hello", [](const Request& req, Response& res) {
        res.set_content("Hello, World!", "text/plain");
    });

    // 处理带参数的 GET 请求
    svr.Get("/greet", [](const Request& req, Response& res) {
        auto name = req.get_param_value("name");
        if (!name.empty()) {
            res.set_content("Hello, " + name + "!", "text/plain");
        } else {
            res.set_content("Hello, Guest!", "text/plain");
        }
    });

    // 处理 POST 请求
    svr.Post("/echo", [](const Request& req, Response& res) {
        res.set_content(req.body, "text/plain");
    });

    // 处理带参数的 POST 请求
    svr.Post("/greet_post", [](const Request& req, Response& res) {
        auto name = req.get_param_value("name");
        if (!name.empty()) {
            res.set_content("Hello, " + name + "!", "text/plain");
        } else {
            res.set_content("Hello, Guest!", "text/plain");
        }
    });

    // 处理文件上传
    svr.Post("/upload", [&](const Request& req, Response& res) {
        auto file = req.get_file_value("file");
        if (file) {
            // 将上传的文件保存到服务器端
            file->save("./uploads/" + file->filename);
            res.set_content("File uploaded successfully", "text/plain");
        } else {
            res.set_content("File upload failed", "text/plain");
        }
    });

    // 处理文件下载
    svr.Get("/download", [&](const Request& req, Response& res) {
        // 将服务器端的文件发送给客户端
        res.download("./uploads/example.txt");
    });

    // 启动服务器,监听端口为 8080
    svr.listen("localhost", 8080, [](const Request& req, Response& res) {
        // 日志记录,可根据实际需要扩展
        std::cout << req.method << " " << req.path << std::endl;
    });

    return 0;
}

在这个示例中,我们使用 get_param_value 和 get_file_value 方法从请求中获取参数和文件。get_param_value 用于获取 GET 或 POST 请求中的参数,而 get_file_value 用于获取上传的文件。

请确保在使用此示例代码时根据你的实际需求调整路径和其他设置。这只是一个基本的示例,生产环境中可能需要更多的安全性和错误处理。