首页 > 解决方案 > 如何从 Rocket 中的请求中检索 HTTP 标头?

问题描述

我会在 Python 中使用烧瓶做这样的事情:

@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.
}

标签: rusthttp-headersrust-rocket

解决方案


Rocket处理程序基于请求警卫。您不会直接访问处理程序中的请求。相反,您创建一个实现FromRequest.

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

struct Token(String);

FromRequest为令牌实现:

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) {
}

如果from_requestfor 方法Token失败,Status::Unauthorized将返回 a。否则,您的处理程序将被调用,您可以处理身份验证逻辑。


推荐阅读