如何在满足外部条件时为actix_web添加路由?
解决Actix Web条件添加路由的问题
Actix Web的App构建器每次调用方法都会返回新的实例,你之前的代码没生效是因为在if块里调用route后,没有把新实例重新赋值给app变量。直接修改代码就能解决问题:
方法一:使用可变变量重新赋值
这是最直观的写法:
let mut app = App::new() .app_data(server_data.clone()) .route("/shoobidoo", web::get().to(handlers::shoobidoo_handler)); // 满足条件时,将调用route后的新实例重新赋值给app if let Some(login_path) = &config.login_path { app = app.route(login_path, web::get().to(handlers::login)); } // 后续正常启动服务 HttpServer::new(move || app) .bind(("127.0.0.1", 8080))? .run() .await?;
方法二:用then方法保持链式调用风格
如果你更习惯链式写法,可以用App::then方法,它允许你基于当前实例做条件修改:
let app = App::new() .app_data(server_data.clone()) .route("/shoobidoo", web::get().to(handlers::shoobidoo_handler)) .then(|current_app| { if let Some(login_path) = &config.login_path { current_app.route(login_path, web::get().to(handlers::login)) } else { current_app // 不满足条件就返回原实例 } }); // 启动服务同上
这两种方式都能直接根据条件注册路由,比用守卫更简洁——守卫是在请求阶段做判断,相当于路由还是存在的只是会被拦截,而直接条件注册路由能让无效路由根本不被添加到应用里。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

