如何从字符串创建响应?(Rust-Rocket)

How to create Response from String?(Rust-Rocket)

我试图为 "MyConfig" 结构实现 Responder 特征。 但是我不知道如何创建 Response (包括类型为 String 的正文),它可以是 return 来自 function.

我试过这段代码。

#[derive(Debug)]
struct MyConfig {
    body: String,
}

impl<'r> Responder<'r> for MyConfig {
    fn respond_to(self, _req: &Request) -> response::Result<'r> {
        let body: String = self.body.clone();
        Response::build()
            .status(Status::Ok)
            // .raw_header("Access-Control-Allow-Origin", "*")
            .sized_body(Cursor::new(body.as_str()))
            .ok()
    }
}

这无法编译,并显示此错误。

error[E0515]: cannot return value referencing local variable `body`
  --> src/main.rs:53:9
   |
53 | /         Response::build()
54 | |             .status(Status::Ok)
55 | |             // .raw_header("Access-Control-Allow-Origin", "*")
56 | |             .sized_body(Cursor::new(body.as_str()))
   | |                                     ---- `body` is borrowed here
57 | |             .ok()
   | |_________________^ returns a value referencing data owned by the current function

body 是局部变量,body.as_str() 是对该局部变量的引用。引用的生存时间不够长,无法作为函数返回的结果的一部分包含在内。

因为在 Cursor::new() 中使用后不需要 body 任何东西,你可以直接传递它而不是作为参考:

.sized_body(Cursor::new(body))

ETA:我找到了这个例子:

Response::build()
    .sized_body(Cursor::new(format!("{}:{}", self.name, self.age)))

(来自 https://api.rocket.rs/v0.4/rocket/response/trait.Responder.html

他们使用字符串而不是引用调用 Cursor::new(),因此 Cursor::new(body) 应该可以工作。

不过想想看,既然您将 self 直接传递给函数而不是作为参考,也许您可​​以完全跳过创建 body 并直接说:

.sized_body(Cursor::new(self.body))