#web-framework #web #web-api #server-api #framework #serve-static

responder

使用这个简单轻量级的框架快速创建API

44次发布

0.1.991 2022年12月25日
0.1.990 2022年12月25日
0.1.84 2022年11月12日
0.1.75 2022年10月26日
0.1.64 2022年8月28日

#9 in #serve-static

Download history 1/week @ 2024-03-26 13/week @ 2024-04-02

134每月下载量

MIT许可协议

54KB
886

响应器

易于使用,易于设置。这是一个简单Web服务器的示例

use responder::prelude::*;

fn main() {

    /*- Initiaize routes -*/
    let routes = Route::Stack("", &[
        Route::Stack("path", &[
            Route::Get("enpoint", endpoint),
            Route::Get("enpoint2", some_other_endpoint),
        ]),
    ]);

    /*- Initiaize server -*/
    Server::new()
        // This will be localhost, use 
        // 0.0.0.0 if using e.g. docker
        .address("127.0.0.1") 
        .port(8080)

        // Serve static files from a folder
        .serve("./static")
        .routes(routes)
        .start()
        .unwrap();

    // Go to 'localhost:8080/path/enpoint' to see results
}

简单,不是吗? 现在我该在哪里以及如何处理所有我的请求?

StreamRespond结构体帮助您管理传入请求,并提供许多构建http响应的选项。

---> Stream

Stream结构体作为参数传递给每个端点函数。它包含有价值的信息,并提供了一些显著的方法来满足您的需求。以下是一个使用Stream结构体特性的端点函数示例

/* Will respond with the http-status code 200 */
fn endpoint(stream:&mut Stream) -> () {
    stream.respond_status(200);
}

---> Respond

Respond结构体用于构建HTTP响应。它主要使用“构建器模式”构建。以下是如何使用它的一个示例

/* Will respond with some text */
fn endpoint(stream:&mut Stream) -> () {
    stream.respond(
        200,
        Respond::new()
            .text("Hello, world!")
    );
}

安全 🚨

现在我们已经介绍了responder的基础知识,我们将简要介绍安全。Rust默认是安全的。因此,我们不需要担心内存泄漏等问题。然而,这并不能阻止人们访问受限的端点。responder有一个解决方案。它被称为origin-control。它是Route结构体中的一个枚举变体,名为ControlledStack,其主要目的是检查传入请求是否满足某些条件,然后要么丢弃请求,要么允许其访问内部端点。以下是如何做到这一点的示例

let routes = &[
    /* Will be accessible to all requests */
    Route::Get("non-admin", non_admin_page),

    /* Everything inside `Route::ControlledStack`
        will be accessible to all requests matching
        the `origin_control` functions criteria */
    Route::ControlledStack(origin_control, "admin", &[
        Route::Get("secret-data", secret_data),
    ])
];

/* Create the origin control function */
fn origin_control_function(stream:&mut Stream) -> bool {
    /* Check if request has the correct token */
    if let Some(token) = stream.headers.get("token") {
        if token == &"password123" {
            /* Return true indicating that
                the request matches criteria */
            return true
        };
    };

    /* Return false indicating that the
        request does not match criteria */
    false
}

依赖关系

~10KB