4 个版本
0.5.0-rc | 2020年3月20日 |
---|---|
0.5.0-beta.2 | 2020年3月5日 |
0.5.0-beta | 2020年3月4日 |
0.5.0-alpha | 2020年3月3日 |
#524 in #web-framework
92KB
2K SLoC
Roa-body
roa的扩展包。此模块提供了一个上下文扩展PowerBody
。
以更简单的方式读写主体。
roa_core
提供了多种读写主体的方法。
use roa_core::{Context, Result};
use futures::AsyncReadExt;
use futures::io::BufReader;
use async_std::fs::File;
async fn get(mut ctx: Context<()>) -> Result {
// roa_core::Body implements futures::AsyncRead.
let mut data = String::new();
ctx.req_mut().body().read_to_string(&mut data).await?;
println!("data: {}", data);
ctx.resp_mut()
// write object implementing futures::AsyncRead
.write(File::open("assets/author.txt").await?)
// write `impl ToString`
.write_str("I am Roa.")
// write `impl Into<Vec<u8>>`
.write_bytes(b"Hey Roa.".as_ref());
Ok(())
}
这些方法很有用,但它们不处理头部,特别是Content-*
头部。
PowerBody
提供了更强大的方法来处理这些。
use roa_core::{Context, Result};
use roa_body::{PowerBody, DispositionType::*};
use serde::{Serialize, Deserialize};
use askama::Template;
use async_std::fs::File;
use futures::io::BufReader;
#[derive(Debug, Serialize, Deserialize, Template)]
#[template(path = "user.html")]
struct User {
id: u64,
name: String,
}
async fn get(mut ctx: Context<()>) -> Result {
// deserialize as json.
let mut user: User = ctx.read_json().await?;
// deserialize as x-form-urlencoded.
user = ctx.read_form().await?;
// serialize object and write it to body,
// set "Content-Type"
ctx.write_json(&user)?;
// open file and write it to body,
// set "Content-Type" and "Content-Disposition"
ctx.write_file("assets/welcome.html", Inline).await?;
// write text,
// set "Content-Type"
ctx.write_text("Hello, World!")?;
// write object implementing AsyncRead,
// set "Content-Type"
ctx.write_octet(File::open("assets/author.txt").await?)?;
// render html template, based on [askama](https://github.com/djc/askama).
// set "Content-Type"
ctx.render(&user)?;
Ok(())
}
依赖项
~8–20MB
~259K SLoC