1 个不稳定版本
0.13.0 | 2024年8月9日 |
---|
#985 在 HTTP 服务器
每月110 次下载
在 hypers 中使用
15KB
240 行
⚡️ 快速开始
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
依赖项
~18–32MB
~563K SLoC