我正在try 实现一个简单的Actix API,我测试的第一个方法是用于在SQLite数据库中创建"book"对象的方法.我已经编写了up.sql、模式、模型和DAO(仅用于封装DB代码),但我缺少一个非常重要的部分:输入.

因此,现在我必须处理处理程序,它应该读取HttpRequest(它将以JSON格式提供),然后将对象保存在SQLite实例中.问题是--这既有趣又恼人--我不知道如何阅读请求的正文,至少是以正确的方式.

我见过这样一种解决方案,即获取原始字节并对其进行解析,但我想对于只读取请求的正文,还有更好、更简单的解决方案.但我找不到任何有用的东西.

pub async fn create_book_handler(req: HttpRequest) -> HttpResponse {
    let book: Book = req.  <--- what comes here?
    books_dao::create_book(&book);
    let response = Json(book);
    HttpResponse::Ok()
        .content_type(ContentType::json())
        .json(response)
}

推荐答案

Actix Web使用"extractors"作为从请求中提取信息的类型安全方法.其中一个提取程序是web::Json,它允许将正文反序列化为给定类型.

你的struct需要实现serde提供的Deserialize个特性.

#[derive(serde::Deserialize)]
struct Book {
    title: String,
}

剩下的唯一要做的就是将类型为web::Json<Book>的提取程序指定为您的路由函数的参数.

async fn some_route(book: web::Json<Book>) -> Result<String> {
    Ok(format!("This book is called {}!", book.title))
}

当调用路径时,Actix Web将自动调用web::Jsonfrom_request方法,将JSON主体反序列化为struct.

Rust相关问答推荐

有条件默认实现

在析构赋值中使用一些现有绑定

更合理的方法来设计样条线函数器?

Rust将String上的迭代器转换为&;[&;str]

应为关联类型,找到类型参数

获取已知数量的输入

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

Cargo.toml:如何有条件地启用依赖项功能?

如何重命名 clap_derive 中的子命令占位符?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

详尽的匹配模式绑定

返回迭代器考虑静态生命周期类型

如何将 C++ 程序链接到 Rust 程序,然后将该 Rust 程序链接回 C++ 程序? (cpp -> rust -> cpp)

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

为实现特征的所有类型实现显示

为什么分配对变量的引用使我无法返回它

有没有办法隐藏类型定义?

如何在 Rust 中构建一个 str

为什么 `ref` 会导致此示例*取消引用*一个字段?