引言:为什么用Rust做REST API?
\nRust是一种现代系统编程语言,它结合了C/C++的性能和无垃圾回收器的内存安全性。对于创建REST API,Rust提供了几个强大的框架,而Actix-web是最流行的之一。在本指南中,我们将逐步在30分钟内用Rust创建一个完整的REST API。即使您是Rust新手,也会看到如何快速上手。
\n\n环境准备
\n在编写代码之前,请确保您已安装Rust。如果没有,请执行以下命令:
\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n安装后检查版本:
\nrustc --version\n现在创建一个新项目:
\ncargo new rust_rest_api\ncd rust_rest_api\n打开Cargo.toml文件并添加依赖:
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }\n运行cargo build来安装所有包。这需要1-2分钟。
创建基础的Rust REST API
\n从一个返回问候语的简单端点开始。打开src/main.rs并编写:
use actix_web::{web, App, HttpServer, Responder};\n\nasync fn hello() -> impl Responder {\n "你好,世界!这是用Rust写的REST API!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n println!("服务器已启动在 http://127.0.0.1:8080");\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(hello))\n })\n .bind("127.0.0.1:8080")?\n .run()\n .await\n}\n使用命令cargo run启动服务器,并在浏览器中打开http://127.0.0.1:8080。您将看到我们的问候语。这是任何Rust REST API的基础。
添加数据结构与JSON
\n真正的REST API处理JSON。创建一个用户模型和获取用户的端点:
\nuse serde::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize)]\nstruct User {\n id: u32,\n name: String,\n email: String,\n}\n\nasync fn get_user() -> impl Responder {\n let user = User {\n id: 1,\n name: "伊万·彼得罗夫".to_string(),\n email: "ivan@example.com".to_string(),\n };\n web::Json(user)\n}\n\n// 在 main() 中添加新路由:\n// .route("/user", web::get().to(get_user))\n现在访问/user,您将获得一个JSON对象。这是关键点:Rust通过serde自动将结构体序列化为JSON。
处理查询参数和POST请求
\n真正的API应该处理不同的HTTP方法和参数。添加一个通过POST创建用户的端点:
\nuse actix_web::web::Json;\n\nasync fn create_user(user: Json<User>) -> impl Responder {\n let new_user = user.into_inner();\n println!("已创建用户:{} ({})", new_user.name, new_user.email);\n web::Json(new_user)\n}\n\n// 在 main() 中:\n// .route("/user", web::post().to(create_user))\n现在可以通过curl发送带有JSON主体的POST请求:
curl -X POST http://127.0.0.1:8080/user \\\n -H "Content-Type: application/json" \\\n -d '{"id":2,"name":"玛丽亚·斯米尔诺娃","email":"maria@example.com"}'\n服务器将返回相同的对象,确认创建成功。这是CRUD操作的基础。
\n\n处理路径参数和查询字符串
\n添加一个通过路径参数按ID获取用户的端点:
\nuse actix_web::web::Path;\n\nasync fn get_user_by_id(path: Path<u32>) -> impl Responder {\n let user_id = path.into_inner();\n // 在实际应用中,这里会查询数据库\n