如何将结构从 Actix 中间件传递到处理程序?
How can I pass structs from an Actix middleware to the handler?
我正在尝试为我的 Actix 应用程序编写身份验证中间件。在中间件中验证请求时,我调用数据库以检索必要的用户数据来验证传入的请求。请求获得授权后,我希望能够将此用户数据传递给处理程序,因为这将使我能够避免对相同数据进行两次查询。
我找不到解决这个问题的方法。到目前为止,我能找到的最佳建议是 "set a request extension"。似乎没有这方面的任何示例,而且关于此的文档也太少,无法确定在此处做什么。
您可以通过扩展将数据从中间件(服务)传递到处理程序。首先,您必须插入分机(在服务中)。
对于 ServiceRequest struct 实现了 HttpMessage hase extensions_mut()
函数。它必须是可变的,因为您将插入新的扩展。它可能看起来像这样:
req.extensions_mut().insert(user);
然后你必须为你的数据结构实现 FromRequest 特性。
impl FromRequest for User {
type Error = actix_web::Error;
type Future = futures::future::Ready<Result<Self, Self::Error>>;
type Config = ();
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
match req.extensions().get::<User>() {
Some(user) => return ok(user.clone()),
None => return err(actix_web::error::ErrorBadRequest("ups..."))
};
}
}
然后你就可以在处理程序中使用它了。
pub async fn get_user_handler(user: User) {}
我正在尝试为我的 Actix 应用程序编写身份验证中间件。在中间件中验证请求时,我调用数据库以检索必要的用户数据来验证传入的请求。请求获得授权后,我希望能够将此用户数据传递给处理程序,因为这将使我能够避免对相同数据进行两次查询。
我找不到解决这个问题的方法。到目前为止,我能找到的最佳建议是 "set a request extension"。似乎没有这方面的任何示例,而且关于此的文档也太少,无法确定在此处做什么。
您可以通过扩展将数据从中间件(服务)传递到处理程序。首先,您必须插入分机(在服务中)。
对于 ServiceRequest struct 实现了 HttpMessage hase extensions_mut()
函数。它必须是可变的,因为您将插入新的扩展。它可能看起来像这样:
req.extensions_mut().insert(user);
然后你必须为你的数据结构实现 FromRequest 特性。
impl FromRequest for User {
type Error = actix_web::Error;
type Future = futures::future::Ready<Result<Self, Self::Error>>;
type Config = ();
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
match req.extensions().get::<User>() {
Some(user) => return ok(user.clone()),
None => return err(actix_web::error::ErrorBadRequest("ups..."))
};
}
}
然后你就可以在处理程序中使用它了。
pub async fn get_user_handler(user: User) {}