如何从字符串创建响应?(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))
我试图为 "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))