21 个版本
0.4.0 | 2024 年 7 月 4 日 |
---|---|
0.4.0-rc5 | 2023 年 12 月 7 日 |
0.4.0-rc3 | 2023 年 10 月 14 日 |
0.4.0-rc1 | 2023 年 7 月 10 日 |
0.2.7 | 2022 年 7 月 1 日 |
#333 in HTTP 服务器
14KB
192 代码行
tinyhttp
tinyhttp
是一个快速、多线程的 HTTP 服务器,使用过程宏来简化开发。
您还可以结合示例,例如使用挂载点和自定义路由
示例 1:使用挂载点
use std::net::TcpListener;
use tinyhttp::internal::config::*;
fn main() {
let socket = TcpListener::bind(":::9001").unwrap();
let mount_point = ".";
let config = Config::new().mount_point(mount_point);
let http = HttpListener::new(socket, config);
http.start();
}
示例 2:使用过程宏
/// Functions marked with the get macro must return with a type of Into<Vec<u8>>
use std::net::TcpListener;
use tinyhttp::prelude::*;
#[get("/")]
fn get() -> &'static str {
"Hello, World!"
}
#[post("/")]
fn post() -> &'static str {
"Hello, there!"
}
fn main() {
let socket = TcpListener::bind(":::80").unwrap();
let routes = Routes::new(vec![get(), post()]);
let config = Config::new().routes(routes);
let http = HttpListener::new(socket, config);
http.start();
}
所有路由函数都必须包含在 Routes::new(vec![])
深入了解路由函数
目前,路由函数可以返回任何可以转换为 Into<Vec<u8>>
或 Response
的类型。
use tinyhttp::prelude::*;
// Example 1: returns anything Into<Vec<u8>>
#[get("/")]
fn ex1_get() -> &'static str {
"Hello World!"
}
// Example 2: same as example 1, but takes a Request as an argument
#[get("/ex2")]
fn ex2_get(req: Request) -> String {
let headers = req.get_headers();
let accept_header = headers.get("accept").unwrap();
format!("accept header: {}", accept_header)
}
// Example 3: takes a Request as an argument and returns a Response for more control
#[get("/ex3")]
fn ex3_get(req: Request) -> Response {
Response::new()
.status_line("HTTP/1.1 200 OK\r\n")
.mime("text/plain")
.body(b"Hello from response!\r\n".to_vec())
}
依赖项
~2–12MB
~129K SLoC