2

我的 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 以外的值通知浏览器登录不成功

4

1 回答 1

2

模板文档(特别是响应者特征):

返回一个响应,其 Content-Type 派生自模板的扩展和一个包含呈现模板的固定大小的正文。如果渲染失败,则返回Errof 。Status::InternalServerError

尝试创建一个Error派生 Responder 特征的新枚举。而不是Result<Redirect, Template>return , return Result<Redirect, Error>whereError看起来像这样:

#[derive(Debug, Responder)]
enum Error {
    #[response(status = 400)]
    BadRequest(Template),
    #[response(status = 404)]
    NotFound(Template),
}
于 2020-06-11T05:04:28.180 回答