API Gateway V2触发Lambda时Form Data格式异常问题求助
问题描述
你配置的API Gateway V2端点触发Lambda函数时,Form Data到达Lambda后呈现异常格式:
- Event Body为base64编码,需执行
event = base64.b64decode(event['body'])解码 - 解码后为multipart/form-data的原始分隔符格式,内容如下:
b'----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="command"\r\n\r\n\r\n----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="text"\r\n\r\this is the text \r\n----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="token"\r\n\r\nXXXXXXXXXXXXXXXX\r\n----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="user_name"\r\n\r\nkim_d\r\n----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="user_id"\r\n\r\n14239\r\n----------------------------809582309949071767113581\r\nContent-Disposition: form-data; name="response_url"\r\n\r\nhttp:"//example.com\r\n----------------------------809582309949071767113581--\r\n'
原因及解决配置项
你确实遗漏了API Gateway V2的payload格式转换配置,默认情况下API Gateway V2不会自动解析multipart/form-data类型的请求,只会将原始body进行base64编码后传给Lambda。
要让API Gateway自动解析Form Data并以结构化格式传给Lambda,需完成以下配置:
- 进入API Gateway V2控制台,找到目标API和对应的路由
- 打开该路由的集成请求设置
- 在请求有效载荷格式转换区域,启用将请求有效载荷转换为Lambda代理格式
- 确保客户端请求的Content-Type为
multipart/form-data,此时API Gateway会自动完成base64解码和表单解析,Lambda可直接从event['body']获取结构化的键值对,同时event['isBase64Encoded']会被设为false
如果不想依赖API Gateway的自动解析,也可在Lambda中手动处理multipart内容,示例代码如下:
import base64 from multipart import parse_form_data def lambda_handler(event, context): # 解码base64格式的请求体 raw_body = base64.b64decode(event['body']) # 解析multipart表单数据 environ = {'CONTENT_TYPE': event['headers']['content-type']} form_data = parse_form_data(environ, raw_body) # 提取表单字段 command = form_data.get('command', '') text = form_data.get('text', '') # 后续业务逻辑处理 return { 'statusCode': 200, 'body': '处理完成' }
注意事项
- 启用格式转换后,无需再手动执行base64解码操作,Lambda直接获取结构化数据
- 确保API Gateway路由的请求方法(POST/PUT等)与客户端发送的请求方法一致
- 若客户端请求的Content-Type非
multipart/form-data,需对应调整配置或处理逻辑
内容的提问来源于stack exchange,提问作者user7692855

