3个版本 (重大更改)

0.3.0 2023年1月29日
0.2.0 2023年1月28日
0.1.0 2023年1月26日

#721HTTP服务器

MIT/Apache

37KB
681

哈罗

ci crates.io chat

哈罗 是一个用 简单同步 编写的 Web 框架。

该项目以 哈罗角色 命名。应用程序接口受到了 web.py 项目的启发。

动机

简而言之,异步Rust更难以使用,并且可能比同步Rust产生更高的维护负担,但作为回报,可以提供最佳性能。异步Rust的所有领域都在不断改进,因此这些问题的影响将随着时间的推移而减弱

https://rust-lang.github.io/async-book/01_getting_started/03_state_of_async_rust.html

正如异步书籍所说,异步Rust尚未成熟。虽然它带来了性能,但也导致了更高的维护负担。本项目旨在为Rust创建一个简单且最小的同步Web框架。

快速开始

使用 cargo 将 haro 添加为依赖项

cargo add haro

然后,在您的 main.rs 中

use haro::{Application, Request, Response, Handler};
use serde_json::json;

fn main() {
    let mut app = Application::new("0:8080");
    let hello_handler = HelloHandler {
        name: "Haro".to_string(),
    };
    app.route("/", |_| Response::str("Hello Haro")); // route by closure
    app.route("/input/:name", input); // route by function
    app.route_handler("/hello", hello_handler); //route by `Handler` trait type
    app.run();
}

fn input(req: Request) -> Response {
    let data = json!({
        "method":req.method(),
        "args":req.args,
        "params":req.params,
        "data":req.data,
    });
    Response::json(data)
}

struct HelloHandler {
    name: String,
}

impl Handler for HelloHandler {
    fn call(&self, _: Request) -> Response {
        Response::str(format!("hello {}", self.name))
    }
}
http get "localhost:8080/"
HTTP/1.1 200 OK
content-length: 12
content-type: text/plain

Hello Haro
http post "localhost:8080/input/world?a=b" c=d
HTTP/1.1 200 OK
content-length: 77
content-type: application/json

{
    "args": {
        "a": "b"
    },
    "data": {
        "c": "d"
    },
    "method": "POST",
    "params": {
        "name": "world"
    }
}

更多示例

该仓库包含 更多示例,展示了如何将所有组件组合在一起。

功能

  • 使用 函数/闭包/特质类型 进行URL路由
  • 最小样板代码的请求和响应
    • 查询参数
    • POST数据
    • JSON
    • Cookie
  • 中间件
  • 模板(可选)
  • 数据库(可选)
  • 测试
  • HTTP2

许可证

在以下许可证中选择其一

任选其一。

依赖关系

~5–24MB
~347K SLoC