#aws-lambda #routing #json-api #requests #handlers #receive #return

lambda-router

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

5 个版本

0.1.5 2024年5月2日
0.1.4 2024年5月2日
0.1.3 2024年1月26日
0.1.2 2024年1月26日
0.1.1 2023年9月10日

#6#receive

MIT 许可证

15KB
120

lambda-router

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

关于 json 和 url 编码的数据

  • 假设您返回的 json 是 Result<T, E> 形式,其中 T & E 实现 Serialize。
  • 假设您接受 Result<T, E> 的外部标记表示形式,您可以从 API 中获取。 阅读 Serde 文档
  • 假设 GET / DELETE 请求在查询字符串中获得扁平化数据。
  • 假设 POST / PUT 请求在正文中获得 json 或 url 编码数据,而查询字符串被忽略。
  • 假设您在请求中没有收到任何数据时,可以显式指定单元类型或其他恰好有一个值的类型作为处理器的输入,您没有问题。
  • 目前,您无法访问标题值或其他请求部分。如果您需要此类功能,请随时提交一个拉取请求。

AWS 上的配置

首先,请确保创建一个 api gateway 端点,该端点是 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!();
}

依赖关系

~14–25MB
~452K SLoC