#lambda #requests #macro #handlers #routing #json #lambda-router

lambda-router-macros

lambda-router crate内部的宏

3个版本

0.1.2 2024年5月2日
0.1.1 2023年9月10日
0.1.0 2023年9月10日

#1127过程宏


用于 lambda-router

MIT 协议

15KB
291

lambda-router

lambda-router 是一个简单的库,用于帮助将 http-api-gateway 请求路由到同一lambda中接收和返回json的处理程序。

关于json和url编码的数据

  • 假设您返回的json形式为 Result<T, E>,其中 T & E 实现了 Serialize。
  • 假设您接受 Result<T, E> 的 Externally tagged 表示形式,来自您的api。 阅读Serde文档
  • 假设GET / DELETE请求在查询字符串中获得扁平化数据。
  • 假设POST / PUT请求在请求体中获得json或url编码数据,而查询字符串被忽略。
  • 假设当您没有从请求中收到任何数据时,您可以明确指定单元类型或其他只有一个值的类型作为处理程序的输入,您没有问题。
  • 目前,您无法访问头值或其他请求部分。如果您需要此类功能,请随时提交pull request。

AWS上的配置

首先,请确保创建一个 api gateway endpoint,它是 http

我愿意添加对非http端点(如lambda函数url)的宏和库支持,但目前我并不使用它们。

添加第一个处理程序

通过使用 router 宏创建处理程序开始

use lambda_router::router;
use serde::{Serialize, Deserialize};

#[derive(Deserialize)]
struct Input {}

#[derive(Serialize)]
struct Output {}

// you may want to consider using "thiserror" and "serde_with" crate to handle errors
// and serialization when variants or other data structures in your error don't impl Serialize
#[derive(Serialize)]
enum MyError {}

#[router(POST "/my_route")]
async fn my_route(input: Input) -> Result<Output, MyError> {
    todo!();
}

创建实际的路由逻辑

在lambda函数的入口点中,您使用 app 宏来自动编写将请求路由到处理程序的if语句

use lambda_http::{Body, Error, Request, Response};
// not_found is a fallback route that returns 404 and no body. it is provided for simple 404 responses, you can read about it below.
use lambda_router::{app, not_found};

async fn function_handler(event: Request) -> Result<Response<Body>, Error> {
    app! {
        event,
        my_route,
        #[default]
        not_found,
    }
}

404未找到回退

如果您只想在请求不匹配任何内容时返回一个简单的404页面而没有主体内容,可以使用上面提到的预构建默认路由器 not_found。您也可以按如下方式实现自己的

use lambda_http::{Body, Error, Request, Response};

async fn my_custom_404(event: Request) -> Result<Response<Body>, Error> {
    todo!();
}

依赖项

~2.4–4MB
~70K SLoC