use actix_web::{get, middleware, web, App, HttpServer, Responder};
use env_logger;
use log::info;
// ...
async fn main() -> io::Result<()> {
dotenv().ok();
+ if std::env::var("RUST_LOG").is_err() {
+ std::env::set_var("RUST_LOG", "actix_web=info");
+ }
+ env_logger::init();
let cfg = crate::config::Config::from_env().unwrap();
let pool = cfg.pg.create_pool(NoTls).unwrap();
+ info!(
"Starting server at http://{}:{}",
cfg.server.host, cfg.server.port
);
HttpServer::new(move || {
App::new()
.data(pool.clone())
+ .wrap(middleware::Logger::default())
// ...
运行以查看日志
$ cargo run
Compiling todo-list v0.1.0 (/Users/qiwihui/rust/todo-list)
Finished dev [unoptimized + debuginfo] target(s) in 1m 19s
Running `target/debug/todo-list`
[2020-10-23T06:43:18Z INFO todo_list] Starting server at http://127.0.0.1:8000
[2020-10-23T06:43:18Z INFO actix_server::builder] Starting 4 workers
[2020-10-23T06:43:18Z INFO actix_server::builder] Starting "actix-web-service-127.0.0.1:8000" service on 127.0.0.1:8000
[2020-10-23T06:45:04Z INFO actix_web::middleware::logger] 127.0.0.1:63751 "GET /todos HTTP/1.1" 200 79 "" "curl/7.64.1" 0.016465
如何获取请求体
首先,我们增加插入数据操作,sql 语句中的 returning id, title 用于返回插入成功的数据
如何获取路径参数
添加根据 id 获取数据操作:
设置请求参数,设置使用
Info
作为请求路径参数序列化结构体:添加路由:
运行并获取结果:
增加日志记录
为了方便查看操作过程,可以增加日志记录,使用
env_logger
方便从环境变量中设置日志记录级别,log
用于记录不同级别日志,比如info
,debug
。Cargo.toml
:在
.env
中可以手动设置日志记录级别,比如main.rs
:运行以查看日志
如何获取请求体
首先,我们增加插入数据操作,sql 语句中的
returning id, title
用于返回插入成功的数据db.rs
:增加请求处理,
CreateTodoList
用于序列化请求的数据:handles.rs
其中,
state: web::Data<AppState>
将 原来的 pool 做了简单的封装,好处在于可以传入多个数据作为web::Data
。同时添加路由:
完成后运行
cargo run
,在使用 curl 进行请求时,注意添加-H "Content-Type: application/json"
头部信息,否则无法处理。其他操作
继续添加其他操作,如获取创建单个项,以及完成项目(
check_todo
)以及对应的路由和请求处理:
小结
参考文档和项目