如何在Rocket中获取HTTP请求的头部信息?

6
我会用Python中的Flask做类似这样的事情:
@app.route('/login/', methods=['POST'])
def login():
    token = request.headers["token"]

我不知道如何访问"token"标头并将其存储为"String"变量。
#![feature(proc_macro_hygiene, decl_macro)]

use rocket::{
    config::{Config, Environment},
    *,
};

fn main() {
    let config = Config::build(Environment::Production)
        .address("0.0.0.0")
        .port(PORT)
        .finalize()
        .unwrap();

    rocket::ignite().mount("/", routes![login]).launch();
}

#[post("/login")]
fn login() {

    // Retrieve headers from request.
}

1
请参阅Rocket文档,了解从请求中获取信息的各种方法。 - kmdreko
2个回答

7

Rocket的处理程序基于请求守卫(Request Guards)。您不会直接在处理程序中访问请求。相反,您需要创建一个实现 FromRequest 的类型。

您可以创建一个包含字符串的令牌结构体:

struct Token(String);

实现 FromRequest 接口,用于 Token:

impl<'a, 'r> FromRequest<'a, 'r> for Token {
    type Error = Infallible;

    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()))
          },
          // token does not exist
          None => Outcome::Failure(Status::Unauthorized)
        }
    }
}

现在您可以将该令牌(Token)用作请求保护:

#[post("/login")]
fn login(token: Token) {
}

如果Tokenfrom_request方法失败,则会返回Status::Unauthorized。否则,将调用处理程序,并且您可以处理身份验证逻辑。

7
Ibraheem Ahmed的答案非常有用,但我不知道如何使用Infallible。我通过以下方式解决了这个问题:
struct Token(String);

#[derive(Debug)]
enum ApiTokenError {
    Missing,
    Invalid,
}

impl<'a, 'r> FromRequest<'a, 'r> 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)),
        }
    }
}

2
std::convert::Infallible 只是一个空枚举,代表永远不会发生的错误。我只是为了举例而使用它。 - Ibraheem Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接