C++ 实现 RESTful API 服务

实现一个 RESTful API 服务需要使用 HTTP 协议进行客户端和服务器之间的通信。C++ 标准库本身不直接支持创建 HTTP 服务,因此我们需要借助外部库来实现。常用的库包括 Boost.Beast(一个基于 Boost 的 HTTP 库)、C++ REST SDK (cpprest)Crow(一个轻量级的 C++ Web 框架)。

在本示例中,我们将使用 Crow 框架,它是一个高效、易于使用的 C++ Web 框架,可以快速构建 RESTful API。

项目介绍

本项目将创建一个简单的 RESTful API 服务,能够处理以下操作:

  1. GET 请求:获取一组资源(例如,用户信息)。
  2. POST 请求:创建一个新资源(例如,创建一个新用户)。
  3. PUT 请求:更新现有资源(例如,更新用户信息)。
  4. DELETE 请求:删除现有资源(例如,删除用户)。

项目实现思路

  1. 选择框架:我们将使用 Crow 框架,它基于 C++ 和 HTTP,可以非常方便地处理 RESTful API 的请求。

  2. API 路由设计:我们将设计几个基本的 RESTful API 路由来响应不同类型的请求:

    • GET /users:返回所有用户。
    • POST /users:创建一个新用户。
    • PUT /users/{id}:更新用户信息。
    • DELETE /users/{id}:删除用户。
  3. 数据存储:为了简单起见,我们将使用内存中的数据结构(如 std::vector)来存储用户数据。

代码实现

首先,安装 Crow 库,可以通过 Crow GitHub 页面 或使用包管理工具(如 vcpkg)来安装。

# 使用 vcpkg 安装 Crow 库
vcpkg install crow

然后,我们开始编写代码。

#include <iostream>
#include <crow.h>
#include <vector>
#include <string>
#include <nlohmann/json.hpp>

// 定义一个用户结构体
struct User {
    int id;
    std::string name;
    std::string email;
};

// 模拟数据库,使用 vector 存储用户数据
std::vector<User> users;

// 获取所有用户
void get_users(crow::response& res) {
    nlohmann::json json_response;
    for (const auto& user : users) {
        nlohmann::json user_json;
        user_json["id"] = user.id;
        user_json["name"] = user.name;
        user_json["email"] = user.email;
        json_response.push_back(user_json);
    }
    res.body = json_response.dump();
    res.set_header("Content-Type", "application/json");
}

// 创建一个新用户
void create_user(const crow::request& req, crow::response& res) {
    auto json_data = nlohmann::json::parse(req.body);
    User new_user;
    new_user.id = users.size() + 1;  // 假设新用户的 ID 为当前用户数加 1
    new_user.name = json_data["name"];
    new_user.email = json_data["email"];
    users.push_back(new_user);
    
    res.code = 201;  // HTTP 状态码 201 表示已创建
    res.body = "User created successfully.";
}

// 更新现有用户
void update_user(const crow::request& req, crow::response& res, int id) {
    auto json_data = nlohmann::json::parse(req.body);
    for (auto& user : users) {
        if (user.id == id) {
            user.name = json_data["name"];
            user.email = json_data["email"];
            res.body = "User updated successfully.";
            res.code = 200;
            return;
        }
    }
    res.body = "User not found.";
    res.code = 404;
}

// 删除用户
void delete_user(crow::response& res, int id) {
    auto it = std::remove_if(users.begin(), users.end(), [id](const User& user) { return user.id == id; });
    if (it != users.end()) {
        users.erase(it, users.end());
        res.body = "User deleted successfully.";
        res.code = 200;
    } else {
        res.body = "User not found.";
        res.code = 404;
    }
}

int main() {
    crow::SimpleApp app;

    // 定义路由
    CROW_ROUTE(app, "/users")   // GET /users - 获取所有用户
        .methods("GET"_method)([] (crow::response& res) {
            get_users(res);
        });

    CROW_ROUTE(app, "/users")   // POST /users - 创建新用户
        .methods("POST"_method)([] (const crow::request& req, crow::response& res) {
            create_user(req, res);
        });

    CROW_ROUTE(app, "/users/<int>")  // PUT /users/{id} - 更新用户信息
        .methods("PUT"_method)([] (const crow::request& req, crow::response& res, int id) {
            update_user(req, res, id);
        });

    CROW_ROUTE(app, "/users/<int>")  // DELETE /users/{id} - 删除用户
        .methods("DELETE"_method)([] (crow::response& res, int id) {
            delete_user(res, id);
        });

    // 启动 HTTP 服务
    app.port(18080).multithreaded().run();

    return 0;
}

代码说明

  1. 用户结构体 User

    • id:用户的唯一标识符。
    • name:用户的姓名。
    • email:用户的电子邮件地址。
  2. 用户数据存储

    • 我们使用 std::vector<User> 来模拟数据库,存储所有的用户信息。
  3. RESTful API 路由

    • /users:处理 GET 和 POST 请求,用于获取所有用户和创建新用户。
    • /users/<int>:处理 PUT 和 DELETE 请求,用于更新和删除指定 ID 的用户。
  4. JSON 处理

    • 我们使用 nlohmann/json 库来解析请求体中的 JSON 数据,并将响应数据打包为 JSON 格式。nlohmann::json 是一个非常流行的 JSON 库,提供了直观且易用的 API。
  5. 启动服务

    • 使用 app.port(18080).multithreaded().run(); 启动 Web 服务并监听端口 18080。

启动服务

  1. 安装 Crow 框架和 nlohmann/json 库(可以使用 vcpkgCMake 配置)。
  2. 编译并运行程序。确保系统中有支持 C++11 或更高版本的编译器。
  3. 启动后,服务将在端口 18080 上运行,你可以通过浏览器或 API 客户端(如 Postman)来访问 API。

示例请求

获取所有用户(GET 请求)

请求:

GET http://localhost:18080/users

响应:

[
    {"id": 1, "name": "Alice", "email": "alice@example.com"},
    {"id": 2, "name": "Bob", "email": "bob@example.com"}
]
创建新用户(POST 请求)

请求:

POST http://localhost:18080/users
Content-Type: application/json

{
    "name": "Charlie",
    "email": "charlie@example.com"
}

响应:

User created successfully.
更新用户(PUT 请求)

请求:

PUT http://localhost:18080/users/1
Content-Type: application/json

{
    "name": "Alice Updated",
    "email": "alice.updated@example.com"
}

响应:

User updated successfully.

总结

本项目实现了一个简单的 RESTful API 服务,使用 C++ 和 Crow 框架处理 HTTP 请求。该 API 支持基本的 CRUD 操作:获取、创建、更新和删除用户。通过使用 nlohmann/json 库,程序能够方便地处理 JSON 数据。该服务可以作为学习和构建更复杂 RESTful API 的基础。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐