rust - 如何从 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.
}
解决方案
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_request
for 方法Token
失败,Status::Unauthorized
将返回 a。否则,您的处理程序将被调用,您可以处理身份验证逻辑。
推荐阅读
- python - 在烧瓶应用程序中导入单元测试模块时如何避免循环引用?
- swiftui - SwiftUI Picker 导航到 Core NavigationView 而不是调用它的 View
- reactjs - this.props.location 最终在我的组件中未定义
- amazon-web-services - botocore.errorfactory.AccessDeniedException:调用RunTask操作时发生错误(AccessDeniedException)
- swift - Firestore 数据库函数的“成本/性能”方面的差异 - setData(from:)、setData(from:merge:)、setData(from:mergeFields:) (Swift)
- ios - 为什么 Swift 推断元类型“Any.Type”而不是类型“Any”?
- python - 如果python中的行总和为零,则用字符串替换单元格:循环dfs列表时无法按预期工作
- flutter - 如何从 youtube 检索数据?
- prometheus - grafana 测试警报有效,但即使满足条件,实际警报也不起作用
- python - 如何使用 selenium 保存密码(登录信息),所以我不必在 Instagram 上一次又一次地登录