#web-framework #hyper #framework #web #gin #springboot

hypers_compression

基于hyper 1.0的简单Rust Web框架

1个不稳定版本

0.13.0 2024年8月9日

#1430 in HTTP服务器

Download history 95/week @ 2024-08-05 15/week @ 2024-08-12

每月110次下载
用于hypers

Apache-2.0

265KB
6.5K SLoC

示例

hypers_rbatis_admin

⚡️ 快速开始

Cargo.toml

## use hypers's full feature
[dependencies]
hypers = { version = "0.13", features = ["full","debug"] }
tokio = { version = "=1.38.0", features = ["full"] }
serde = { version = "=1.0.205", features = ["derive"] }

Rust代码

use hypers::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
pub struct User {
    pub email: Option<String>,
    pub age: Option<u16>,
}

#[derive(Serialize, Deserialize)]
pub struct Header<'a> {
    pub host: Option<&'a str>,
    #[serde(rename(deserialize = "user-agent"))]
    pub user_agent: Option<&'a str>,
    pub accept: Option<&'a str>,
}

pub struct UserController;

#[controller(name = "macro")]
impl UserController {
    // http://127.0.0.1:7878/macro/header
    // Request Header Params
    #[get("/header")]
    async fn header<'a>(req: &'a mut Request) -> Result<Response> {
        let headers = req.parse_header::<Header<'a>>()?;
        let mut res = Response::default();
        res.status(200).json(&headers);
        Ok(res)
    }

    // http://127.0.0.1:7878/macro/[email protected]/18
    // Uri Path Params
    #[delete("/:email/:age")]
    pub async fn delete(req: &mut Request) -> impl Responder {
        let user = req.parse_param::<User>()?;
        Ok::<_, Error>((200, Json(user)))
    }

    // http://127.0.0.1:7878/macro/[email protected]&age=19
    // Query Params
    #[get("/query")]
    async fn query(req: &mut Request) -> impl Responder {
        let user = req.parse_query::<User>()?;
        Ok::<_, Error>((200, Json(user)))
    }

    // http://127.0.0.1:7878/macro/create
    // Context-Type : application/json
    #[post("/create")]
    pub async fn create(req: &mut Request) -> impl Responder {
        let _a = req.accept();
        let user = req.parse_json::<User>().await?;
        let _payload = req.payload().await?;
        Ok::<_, Error>((200, Json(user)))
    }

    // http://127.0.0.1:7878/macro/update
    // Context-Type : application/x-www-form-urlencoded
    #[put("/update")]
    async fn update(req: &mut Request) -> impl Responder {
        let user = req.parse_form::<User>().await?;
        Ok::<_, Error>((200, Form(user)))
    }

    // http://127.0.0.1:7878/macro/multipart_form
    // Context-Type : multipart/form-data Form Fields
    #[post("multipart_form")]
    pub async fn multipart_form(req: &mut Request) -> impl Responder {
        let user = req.parse_form::<User>().await?;
        Ok::<_, Error>((200, Form(user)))
    }

    // http://127.0.0.1:7878/macro/body_bytes
    #[post("/body_bytes")]
    pub async fn body_bytes(req: &mut Request) -> impl Responder {
        let bytes = req.payload().await?;
        let bytes = bytes.clone();
        Ok::<_, Error>((200, bytes))
    }
}
#[tokio::main]
async fn main() -> Result<()> {
    let mut root = Router::default();
    root.push(UserController);
    println!("root = {:#?}", root);
    let listener = hypers::TcpListener::bind("127.0.0.1:7878").await?;
    hypers::listen(root, listener).await
}

支持OpenAPI

hypers_openapi

依赖项

~15–28MB
~536K SLoC