如何从 Rocket 中的请求中检索 HTTP headers?
How to retrieve HTTP headers from a request in Rocket?
我会在 Python 中使用烧瓶做这样的事情:
@app.route('/login/', methods=['POST'])
def login():
token = request.headers["token"]
我不知道如何访问 token
header 并将其存储为 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.
}
Rocket
处理程序基于 Request Guards。您不直接访问处理程序中的请求。相反,您创建了一个实现 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) {
}
如果 Token
的 from_request
方法失败,将返回 Status::Unauthorized
。否则,您的处理程序将被调用,您可以处理身份验证逻辑。
很有用,但我不知道如何使用 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)),
}
}
}
我会在 Python 中使用烧瓶做这样的事情:
@app.route('/login/', methods=['POST'])
def login():
token = request.headers["token"]
我不知道如何访问 token
header 并将其存储为 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.
}
Rocket
处理程序基于 Request Guards。您不直接访问处理程序中的请求。相反,您创建了一个实现 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) {
}
如果 Token
的 from_request
方法失败,将返回 Status::Unauthorized
。否则,您的处理程序将被调用,您可以处理身份验证逻辑。
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)),
}
}
}