如何从零开始构建一个Rust Web API - Luca Palmieri
1. 引言
在本章中,我们将从零开始构建一个 Rust Web API,目标是实现一个简单的电子邮件订阅功能。我们会逐步完成以下任务:
- 注册新订阅者;
- 选择合适的 Web 框架;
- 实现第一个 API 端点:健康检查;
- 编写第一个集成测试。
通过这些步骤,我们将为后续的开发打下坚实的基础。
2. 项目启动策略
在开始构建项目之前,我们需要完成一些前期准备工作:
- 选择 Web 框架:熟悉框架的基本用法;
- 制定测试策略:确保代码质量;
- 选择数据库交互库:存储用户的电子邮件;
- 定义数据库迁移策略:管理数据库模式的演变;
- 编写数据库查询:实现数据存储和读取。
这些任务看似繁重,但通过合理的规划和持续集成管道的支持,我们可以逐步完成。
3. 选择 Web 框架
截至 2022 年 3 月,actix-web 是 Rust 生态中最成熟的 Web 框架之一。它基于 tokio 异步运行时,拥有广泛的社区支持和丰富的功能。其他框架如 tide、rocket 和 warp 也具有潜力,但在生产环境中,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. 总结
通过本章的学习,我们完成了以下任务:
- 选择了
actix-web作为 Web 框架; - 实现了健康检查端点;
- 编写了集成测试;
- 优化了测试环境。
这些内容为后续开发奠定了基础。在下一章中,我们将继续探索如何与 PostgreSQL 数据库交互,并实现用户订阅功能。
原文链接: https://www.lpalmieri.com/posts/2020-08-09-zero-to-production-3-how-to-bootstrap-a-new-rust-web-api-from-scratch/
最新文章
- 通过 SEO rank API 获取百度关键词排名
- 音乐情绪可视化:Cyanite.ai 音乐情感分析API如何帮助我们理解音乐
- 从Flask到FastAPI的平滑迁移
- 什么是 API 即服务?
- 5大API故障原因可能正在干扰您的集成工作
- 如何获取Perplexity AI API Key 密钥(分步指南)
- 轻松翻译网页内容:Python 实现 kimi网页版 翻译功能
- 身份证OCR识别API在Java、Python、PHP中的使用教程
- 精通.NET Web API:构建强大API的最佳实践
- Flask、FastAPI 与 Django 框架比较:Python Web 应用开发教程
- 十大 API 安全供应商
- REST API接口命名的最佳实践