4 个版本

0.5.0-rc2020年3月20日
0.5.0-beta.22020年3月5日
0.5.0-beta2020年3月4日
0.5.0-alpha2020年3月3日

#524 in #web-framework

MIT 协议

92KB
2K SLoC

Stable Test codecov Rust Docs Crate version Download Version License: MIT

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