rust - 如何设置 (Rust) Rocket API 端点模板响应的 HTTP 状态代码?

标签 rust rust-rocket

我的 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 以外的其他内容通知浏览器登录成功。

最佳答案

来自Template docs (特别是 Responder 特征):

Returns a response with the Content-Type derived from the template's extension and a fixed-size body containing the rendered template. If rendering fails, an Err of Status::InternalServerError is returned.

尝试制作一个新的 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 - 如何设置 (Rust) Rocket API 端点模板响应的 HTTP 状态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60908423/

相关文章:

rust - Rust 项目中的工作区内依赖关系

indexing - 实现 Index 特征以返回一个不是引用的值

rust - 如何检查 Flatbuffer 是否有效或正确处理错误?

rust - Rocket Framework 示例无法编译

rust - 要求类型参数是结构

使用异步函数的 Rust 文档测试 #[tokio-test]

rust - 无法将功能移至另一个文件?

rust - 柴油。火箭和火箭.rs : don't understand why it wants a databases table

rust - 打开的图像作为全局变量?

rust - Rust Rocket 如何推断包含在结果/选项中的返回类型?