From f34062e162acbcd19e66246816a8237d2ac13c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=90=E5=AE=B6?= Date: Sun, 29 Sep 2024 20:02:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0prefix-url=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.toml | 1 + library/src/core/config.rs | 1 + library/src/middleware/req_ctx.rs | 32 ++++++++++++++++--------------- server/src/lib.rs | 7 ++++--- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app.toml b/app.toml index 610135c..14ecf13 100644 --- a/app.toml +++ b/app.toml @@ -1,5 +1,6 @@ [server] name = "chuanyue-server" +prefix_url = "/gm/v1" port = 8000 debug = true diff --git a/library/src/core/config.rs b/library/src/core/config.rs index c4c71eb..53528b3 100644 --- a/library/src/core/config.rs +++ b/library/src/core/config.rs @@ -15,6 +15,7 @@ pub struct Config { #[derive(Clone, Debug, Deserialize)] pub struct Server { pub name: String, + pub prefix_url: String, pub port: u32, } diff --git a/library/src/middleware/req_ctx.rs b/library/src/middleware/req_ctx.rs index 5d25a07..8ce2e21 100644 --- a/library/src/middleware/req_ctx.rs +++ b/library/src/middleware/req_ctx.rs @@ -12,27 +12,29 @@ const WHITE_LIST: &[(&str, &str)] = &[ /// 认证中间件,包括网络请求白名单、token验证、登录缓存 pub async fn authenticate_ctx(mut req: Request, next: Next) -> Response { + // 解析语言 let mut language = String::from("zh-CN"); + let language_header = req.headers().get(header::ACCEPT_LANGUAGE); + language = match language_header { + Some(value) => { + let value_str: Vec<&str> = value.to_str().unwrap_or("zh-CN").split(',').collect(); + if value_str.is_empty() { + language + } else { + String::from(value_str[0]) + } + }, + None => language, + }; + req.extensions_mut().insert(WhiteContext { lang_tag: language.clone() }); // 获取请求的url和method,然后判断是否在白名单中,如果在白名单中,则直接返回next(req),否则继续执行下面的代码 let method = req.method().clone().to_string(); - let uri = req.uri().path_and_query().unwrap().to_string(); + let mut uri = req.uri().path_and_query().unwrap().to_string(); + uri = uri.replace(&config!().server.prefix_url, ""); + tracing::debug!("请求路径: {}", uri); if WHITE_LIST.into_iter().find(|item| { return item.0 == method && item.1 == uri; }).is_some() { - // 解析语言 - let language_header = req.headers().get(header::ACCEPT_LANGUAGE); - language = match language_header { - Some(value) => { - let value_str: Vec<&str> = value.to_str().unwrap_or("zh-CN").split(',').collect(); - if value_str.is_empty() { - language - } else { - String::from(value_str[0]) - } - }, - None => language, - }; - req.extensions_mut().insert(WhiteContext { lang_tag: language }); return next.run(req).await; } diff --git a/server/src/lib.rs b/server/src/lib.rs index 8fcb248..5f4b997 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -22,6 +22,8 @@ pub async fn serve() { /// 初始化router,包括router中间件和数据 fn init() -> Router { + let auth: Router = controller::init(); + let trace_layer = TraceLayer::new_for_http().make_span_with(|request: &Request| { let req_id = match request .headers() @@ -34,11 +36,9 @@ fn init() -> Router { tracing::error_span!("request_id", id = req_id) }); - let auth: Router = controller::init(); - Router::new() .route("/", get(|| async { "hello" })) - .nest("/gm/v1", auth) + .nest(&config!().server.prefix_url, auth) .layer( ServiceBuilder::new() .layer(axum::middleware::from_fn( @@ -48,6 +48,7 @@ fn init() -> Router { library::middleware::req_log::handle, )) .layer(axum::middleware::from_fn(library::middleware::cors::handle)) + .layer(trace_layer) .layer(axum::middleware::from_fn( library::middleware::req_id::handle, ))