如何在Rust AWS Lambda中正确序列化HTTP请求并获取routeKey
问题描述
我正在按照AWS教程通过HTTPS请求访问DynamoDB,官方提供的JavaScript示例可正常运行,API Gateway配置无误,用curl命令 curl -v https://xxxxxxxx.execute-api.us-west-2.amazonaws.com/items 能成功获取表中数据。
但用Rust构建Lambda时遇到问题,收到错误:{"message":"Internal Server Error"}。我需要像JS示例那样访问routeKey,以下是相关代码和信息:
无效的Rust示例代码
use lambda_runtime::{service_fn, Error, LambdaEvent}; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct Event { pub request_context: RequestContext, } #[derive(Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct RequestContext { pub event_type: EventType, pub route_key: String, } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "UPPERCASE")] pub enum EventType { Connect, Disconnect, } #[derive(Serialize)] struct Response { req_id: String, msg: String, } pub(crate) async fn my_handler(event: LambdaEvent<Event>) -> Result<Response, Error> { let result = event.payload.request_context.route_key; let resp = Response { req_id: event.context.request_id, msg: format!("{}", result), }; Ok(resp) } #[tokio::main] async fn main() -> Result<(), Error> { let func = service_fn(my_handler); lambda_runtime::run(func).await?; Ok(()) }
可正常运行的JavaScript示例代码片段
exports.handler = async (event, context) => { let body; let statusCode = 200; const headers = { "Content-Type": "application/json" }; try { switch (event.routeKey) { case "DELETE /items/{id}": break; /// do something default: break; } //... }
实际收到的Lambda Event Payload
{ "headers": { "accept": "*/*", "content-length": "0", "host": "xxxxxx.execute-api.us-west-2.amazonaws.com", "user-agent": "curl/7.81.0", "x-amzn-trace-id": "Root=x-xxxxxxx-xxxxxxxx", "x-forwarded-for": "xx.xxx.xxxx.xxx", "x-forwarded-port": "443", "x-forwarded-proto": "https" }, "isBase64Encoded": false, "rawPath": "/items", "rawQueryString": "", "requestContext": { "accountId": "xxxxxxxxxx", "apiId": "xxxxxxxxxx", "domainName": "xxxxxxxxx.execute-api.us-west-2.amazonaws.com", "domainPrefix": "xxxxxxxx", "http": { "method": "GET", "path": "/items", "protocol": "HTTP/1.1", "sourceIp": "xx.xxxx.xxx.xx", "userAgent": "curl/7.81.0" }, "requestId": "xxxxxxxxxxx", "routeKey": "GET /items", "stage": "$default", "time": "01/Dec/2022:08:07:39 +0000", "timeEpoch": 1669882059705 }, "routeKey": "GET /items", "version": "2.0" }
我怀疑错误源于结构体无法正确反序列化Payload。
内容的提问来源于stack exchange,提问作者rherrmannr
相关产品推荐
相关产品推荐

