引言:为何使用 Rust 开发 REST API?
Rust 是一种兼具 C++ 性能与内存安全性的现代系统编程语言。近年来,它被广泛用于构建高负载 Web 服务和 REST API。在本指南中,我们将使用 Actix-web 框架在 30 分钟内创建一个完整的 Rust REST API。
为何选择 Rust 开发 REST API?
- 性能: Rust 编译为原生代码且不使用垃圾回收器,提供了最大化的请求处理速度。
- 安全性: 所有权和借用系统消除了所有与内存相关的错误类别。
- 可扩展性: Actix-web 是世界上最快的 Web 框架之一,能够每秒处理数百万个请求。
阅读完本文后,您将拥有一个包含多个端点、错误处理以及便于未来扩展结构的现成项目。
步骤 1:项目设置与依赖安装
首先,让我们创建一个新的 Cargo 项目。打开您的终端并运行:
cargo new rust_rest_apicd rust_rest_api现在打开 Cargo.toml 文件并添加以下依赖:
[dependencies]actix-web = "4"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1", features = ["full"] }uuid = { version = "1.0", features = ["v4", "serde"] }我们来分解一下每个库的作用:
- actix-web — 用于创建 HTTP 服务器的主要 Web 框架。
- serde / serde_json — 数据的序列化和反序列化为 JSON 格式。
- tokio — 一个异步运行时,是 Actix 运行所必需的。
- uuid — 为我们的实体生成唯一标识符。
运行 cargo build 以下载所有依赖。首次运行时需要一些时间。
步骤 2:创建数据模型与存储
我们的 API 将管理一个任务列表(一个 TODO 应用程序)。让我们创建一个简单的模型。打开 src/main.rs 并添加以下代码:
use actix_web::{web, App, HttpServer, HttpResponse, middleware::Logger};use serde::{Deserialize, Serialize};use std::sync::Mutex;use uuid::Uuid;
// 任务模型#[derive(Debug, Serialize, Deserialize, Clone)]struct Task { id: Uuid, title: String, completed: bool,}
// 创建任务的请求#[derive(Debug, Deserialize)]struct CreateTaskRequest { title: String,}
// 任务存储(内存中)struct AppState { tasks: Mutex>,} 我们使用 Mutex 来实现线程安全的数据访问。在真实项目中,您会用数据库替换它,但此选项用于演示目的已足够。
现在让我们添加一个初始化应用程序状态的函数:
fn init_tasks() -> Vec { vec![ Task { id: Uuid::new_v4(), title: "学习 Rust".to_string(), completed: false, }, Task { id: Uuid::new_v4(), title: "编写 REST API".to_string(), completed: true, }, ]} 步骤 3:实现 CRUD 端点
现在让我们为 REST API 创建主要处理器。在模型声明之后添加以下代码:
GET /tasks — 获取所有任务列表
async fn get_tasks(data: web::Data<AppState>) -> HttpResponse { let tasks = data.tasks.lock().unwrap(); HttpResponse::Ok().json(tasks.clone())}POST /tasks — 创建新任务
async fn create_task( data: web::Dat