曹耘豪的博客

Rust Web之Actix

  1. 添加依赖
  2. 实现
    1. Get请求
    2. main启动
  3. 跨域 CORS
  4. 读取.env文件

https://actix.rs/docs

添加依赖

cargo install actix-web

1
2
[dependencies]
actix-web = "4"

实现

Get请求

分页查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 定义get参数
#[derive(Deserialize)]
struct PageParams {
page: Option<i32>, // 可选参数
}

#[get("/page")]
async fn page(
params: web::Query<PageParams>, // 获取Get参数
data: web::Data<AppState>, // 获取应用状态
) -> actix_web::Result<impl Responder> {
let db = &data.db;
let page = params.page.unwrap_or(1); // 如果没传就是第1页

// 数据库访问获取结果

Ok(web::Json(result)) // 返回JSON格式
}

main启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 定义应用状态,这里保存数据库连接
#[derive(Debug, Clone)]
struct AppState {
db: DB,
}

let db: DB = connect().await.unwrap(); // 连接数据库
let state = AppState { db };

let server_url = "127.0.0.1".to_string();

let server = HttpServer::new(move || {
App::new()
.wrap(Logger::default()) // 默认日志输出
.service(
web::scope("/api")
.service(page), // 使用scope,实际接口为/api/page
)
.app_data(web::Data::new(state.clone())) // 挂载应用状态
})
.bind(&server_url); // 绑定host:port

println!("Starting server at {server_url}");
server?.run().await

跨域 CORS

cargo install actix-cors

1
2
3
4
5
6
7
let cors = Cors::default()
.allow_any_header()
.allow_any_method()
.allow_any_origin();
App::new()
.wrap(cors)
// ...

读取.env文件

引入依赖

cargo install dotenv

1
2
dotenv_codegen = "0.15.0"
dotenvy = "0.15.7"

在main中执行

1
2
3
4
5
6
7
dotenvy::dotenv().ok();

// 读取
let host = env::var("HOST").expect("HOST is not set in .env file");
let port = env::var("PORT").expect("PORT is not set in .env file");

let server_url = format!("{host}:{port}");
   /