Actix Web指南
快速入门
// Cargo.toml
// actix-web = "4"
// serde = { version = "1", features = ["derive"] }
// tokio = { version = "1", features = ["full"] }
use actix_web::{web, App, HttpServer, HttpResponse, Responder};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct User { id: u32, name: String }
async fn get_users() -> impl Responder {
let users = vec![
User { id: 1, name: "Alice".into() },
];
HttpResponse::Ok().json(users)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/users", web::get().to(get_users))
.route("/users/{id}", web::get().to(get_user))
})
.bind("0.0.0.0:8080")?
.run()
.await
}
提取器
// 路径参数
async fn get_user(path: web::Path<u32>) -> impl Responder {
let id = path.into_inner();
HttpResponse::Ok().json(User { id, name: "Alice".into() })
}
// 查询参数
#[derive(Deserialize)]
struct Pagination { page: u32, limit: u32 }
async fn list(query: web::Query<Pagination>) -> impl Responder {
HttpResponse::Ok().json(query.0)
}
// JSON 请求体
async fn create(body: web::Json<User>) -> impl Responder {
HttpResponse::Created().json(body.0)
}
// 应用状态
async fn with_state(data: web::Data<AppState>) -> impl Responder {
HttpResponse::Ok().body(data.version.clone())
}