如何从零开始构建一个Rust Web API - Luca Palmieri

作者:API传播员 · 2025-12-07 · 阅读时间:4分钟
本文从零开始构建一个Rust Web API,实现电子邮件订阅功能,包括选择actix-web框架、实现健康检查端点、编写集成测试和优化测试环境,为后续开发奠定基础。

1. 引言

在本章中,我们将从零开始构建一个 Rust Web API,目标是实现一个简单的电子邮件订阅功能。我们会逐步完成以下任务:

  1. 注册新订阅者;
  2. 选择合适的 Web 框架;
  3. 实现第一个 API 端点:健康检查;
  4. 编写第一个集成测试。

通过这些步骤,我们将为后续的开发打下坚实的基础。


2. 项目启动策略

在开始构建项目之前,我们需要完成一些前期准备工作:

  • 选择 Web 框架:熟悉框架的基本用法;
  • 制定测试策略:确保代码质量;
  • 选择数据库交互库:存储用户的电子邮件;
  • 定义数据库迁移策略:管理数据库模式的演变;
  • 编写数据库查询:实现数据存储和读取。

这些任务看似繁重,但通过合理的规划和持续集成管道的支持,我们可以逐步完成。


3. 选择 Web 框架

截至 2022 年 3 月,actix-web 是 Rust 生态中最成熟的 Web 框架之一。它基于 tokio 异步运行时,拥有广泛的社区支持和丰富的功能。其他框架如 tiderocketwarp 也具有潜力,但在生产环境中,actix-web 是更为稳妥的选择。


4. 实现健康检查端点

4.1 健康检查的作用

健康检查端点通常用于监控应用程序的运行状态。例如,在使用 Kubernetes 或 Nomad 等容器编排工具时,健康检查可以帮助检测服务是否正常运行,并在必要时触发重启。

我们将实现一个简单的健康检查端点,当接收到对 /[health](https://www.explinks.com/provider/uid2024082360910824cb28)_check 的 GET 请求时,返回一个 HTTP 200 响应。

4.2 编写健康检查代码

首先,在 main.rs 文件中添加以下代码:

use actix_web::{web, App, HttpServer, HttpResponse};

async fn health_check() -> HttpResponse {
    HttpResponse::Ok().finish()
}#[actix_web::main]
async fn main() -> std::io::Result {    HttpServer::new(|| {        App::new()
            .route("/health_check", web::get().to(health_check))
    })
    .bind("127.0.0.1:8000")?
    .run()
    .await
}

然后,在 Cargo.toml 文件中添加以下依赖项:

[dependencies]
actix-web = "4.0"
tokio = { version = "1", features = ["full"] }

运行以下命令安装依赖项:

cargo check

确保代码编译无误。


5. 健康检查端点的测试

5.1 测试的重要性

API 是与外部系统交互的桥梁,其行为需要稳定可靠。通过测试,我们可以确保 API 的功能符合预期,并避免引入回归问题。

5.2 编写测试代码

tests/health_check.rs 文件中添加以下测试代码:

#[tokio::test]
async fn health_check_works() {
    // 启动应用程序
    let address = spawn_app();
    let client = reqwest::Client::new();

    // 发送 GET 请求到 /health_check
    let response = client
        .get(&format!("{}/health_check", address))
        .send()
        .await
        .expect("Failed to execute request.");    // 验证响应
    assert!(response.status().is_success());
    assert_eq!(response.content_length(), Some(0));
}fn spawn_app() -> String {
    let server = zero2prod::run("127.0.0.1:0").expect("Failed to bind address");
    let port = server.local_addr().port();
    let _ = tokio::spawn(server);
    format!("http://127.0.0.1:{}", port)
}

运行以下命令执行测试:

cargo test

测试通过后,说明健康检查端点工作正常。


6. 优化与改进

6.1 清理资源

在测试运行结束后,确保后台运行的应用程序正确关闭,以释放端口资源。

6.2 动态分配端口

为避免端口冲突,可以在运行时动态分配可用端口。修改 spawn_app 函数,使其返回随机分配的端口地址。


7. 总结

通过本章的学习,我们完成了以下任务:

  1. 选择了 actix-web 作为 Web 框架;
  2. 实现了健康检查端点;
  3. 编写了集成测试;
  4. 优化了测试环境。

这些内容为后续开发奠定了基础。在下一章中,我们将继续探索如何与 PostgreSQL 数据库交互,并实现用户订阅功能。

原文链接: https://www.lpalmieri.com/posts/2020-08-09-zero-to-production-3-how-to-bootstrap-a-new-rust-web-api-from-scratch/