actix web的开发环境搭建
1. 本章目标
- 引入actix相关依赖
- 创建一个入门示例
- 理解原理
2. 核心概念
| 概念 | 含义 | 示例 |
|---|---|---|
| async/await | 异步函数机制 | async fn run() |
| Future | 表示一个异步计算 | impl Future<Output=T> |
| tokio runtime | 异步运行时调度器 | #[tokio::main] |
理解重点:Rust 的异步模型基于“协作式调度”,不是抢占式线程。
3. 代码实践
目录结构
.
├── Cargo.lock
├── Cargo.toml
├── doc
└── src
└── main.rs # 应用程序入口
引入依赖
在cargo.toml文件下引入actix-web相关的依赖
[dependencies]
actix-web = "4.11.0"
tokio = { version = "1.47.1",features = ["macros", "rt-multi-thread"]}
- actix-web是一个高性能的异步web框架
- tokio提供异步运行时
rt-multi-thread启用多线程执行器macros启用相关的过程宏(如#[tokio::main])
代码实现
创建应用程序的入口
use actix_web::{web, App, HttpResponse, HttpServer, Responder};
async fn hello()->impl Responder {
HttpResponse::Ok().finish()
}
#[tokio::main]
async fn main()->std::io::Result<()> {
HttpServer::new(||
App::new().route("/hello", web::get().to(hello))
).bind("127.0.0.1:8000")?.run().await
}
代码分析
main函数
#[tokio::main]
async fn main()->std::io::Result<()>
在Rust中,只有异步函数可以调用异步函数,因此需要给函数添加
async代表它是异步,而main函数比较特殊(不能将main设置为异步),所以只能用过程宏了
由于H
ttpServer::new(/*...*/).bind(/*...*/)返回成功Ok(()),或者返回Err(std::io::Error)代表失败,因此main函数需要返回值Result<()>,这里错误类型的声明可以省略,就使用默认(std::io::Error)
HttpServer
HttpServer::new(||{...}).bind()?.run().await
- 通过
HttpServer::new()创建一个HttpServer实例,这个方法接受一个闭包作为输入,需要注意的是: 这个闭包必须返回一个App(|| -> App)- 可以调用
bind方法配置这个HttpServer实例的Ip和端口- 调用
run方法返回一个Serverfuture,此时服务器还没真正启动(不能监听和处理请求)await会等待Server的完成,而Server不会完成,但通过Ctrl-C等强制退出(服务器停止)
App
App::new().route("/hello", /*Router*/)
- App::new函数创建一个新的App实例
- 调用route方法,它接受两个参数,第一个是定义了请求的路径,第二个接受一个Route实例,不能直接使用函数
- 通过
web::get().to(hello)获取一个Route,接受一个异步函数,这个函数的返回值是impl Responder的,HttpResponder实现了Responder trait,因此可以将返回值定义为HttpResponder
4万+

被折叠的 条评论
为什么被折叠?



