我正在学习 Rust。accessToken现在我使用此代码从 Rust Rocket 中的 HTTP 请求标头获取:
use rocket::request::FromRequest;
use rocket::{Request, request};
use rocket::outcome::Outcome;
use rocket::http::Status;
struct Token(String);
#[derive(Debug)]
enum ApiTokenError {
Missing,
Invalid,
}
impl<'a, 'r> FromRequest<'a> for Token {
type Error = ApiTokenError;
fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
let token = request.headers().get_one("token");
match token {
Some(token) => {
// check validity
Outcome::Success(Token(token.to_string()))
}
None => Outcome::Failure((Status::Unauthorized, ApiTokenError::Missing)),
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译该项目时,它显示如下错误:
error[E0195]: lifetime parameters or bounds on method `from_request` do not match the trait declaration
--> src/token.rs:17:20
|
17 | fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
| ^ lifetimes do not match method in trait
Run Code Online (Sandbox Code Playgroud)
代码哪里出了问题,我应该做什么来解决这个问题?
FromRequest 是一个异步特征。您需要附加该标记,并使其异步。不过,您不需要限制 Request 值的生命周期(因此您不需要两个生命周期参数;您可以使用'_):
#[rocket::async_trait]
impl<'r> FromRequest<'r> for Token {
type Error = ApiTokenError;
async fn from_request(request: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4201 次 |
| 最近记录: |