如何设置(Rust)Rocket API 端点的模板响应的 HTTP 状态代码?
Posted
技术标签:
【中文标题】如何设置(Rust)Rocket API 端点的模板响应的 HTTP 状态代码?【英文标题】:How can I set the HTTP status code of a (Rust) Rocket API endpoint's Template response? 【发布时间】:2020-07-09 12:22:45 【问题描述】:我的 Rocket API 中有以下登录 POST 端点处理程序:
#[post("/login", data = "<login_form>")]
pub fn login_validate(login_form: Form<LoginForm>) -> Result<Redirect, Template>
let user = get_user(&login_form.username).unwrap();
match user
Some(existing_user) => if verify(&login_form.password, &existing_user.password_hash).unwrap()
return Ok(Redirect::to(uri!(home)))
,
// we now hash (without verifying) just to ensure that the timing is the same
None =>
hash(&login_form.password, DEFAULT_COST);
,
;
let mut response = Template::render("login", &LoginContext
error: Some(String::from("Invalid username or password!")),
);
// TODO: <<<<<<<<<< HOW CAN I SET AN HTTP STATUS CODE TO THE RESPONSE?
Err(response)
我正在尝试设置 HTTP 状态响应代码,但找不到正确的方法?最好用 200 以外的值通知浏览器登录不成功。
【问题讨论】:
【参考方案1】:来自Template docs(特别是响应者特质):
返回一个响应,其 Content-Type 派生自模板的扩展和一个包含呈现模板的固定大小的正文。如果渲染失败,则返回
Status::InternalServerError
中的Err
。
尝试创建一个新的 Error
枚举来派生 Responder 特征。不要返回Result<Redirect, Template>
,而是返回Result<Redirect, Error>
,其中Error
看起来像这样:
#[derive(Debug, Responder)]
enum Error
#[response(status = 400)]
BadRequest(Template),
#[response(status = 404)]
NotFound(Template),
【讨论】:
以上是关于如何设置(Rust)Rocket API 端点的模板响应的 HTTP 状态代码?的主要内容,如果未能解决你的问题,请参考以下文章
Rust - 无法从 Rocket State 访问 r2d2 池连接
Rocket 每晚需要最低版本的 Rust,但已经安装了更高的稳定版本
返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录