Lambda+API Gateway测试与Postman请求返回不一致问题求助
问题排查与解决方案
问题根源
Lambda控制台测试的事件是直接将JSON作为event的顶层结构,但通过API Gateway转发请求时,event的结构完全不同——POST请求的JSON体被封装在event['body']字段中,且是JSON字符串格式,而非解析后的对象。这就是为什么直接用event.get("number")会返回null。
修复代码
修改Lambda函数,先解析body字段中的JSON字符串,再提取number值,同时兼容控制台测试的场景:
import json import random def lambda_handler(event, context): # 解析请求体(兼容API Gateway和控制台测试) if event.get("body"): try: body_data = json.loads(event["body"]) phone = body_data.get("number") except json.JSONDecodeError: return { 'statusCode': 400, 'body': json.dumps({"error": "无效的请求体格式,请发送JSON数据"}) } else: # 适配控制台测试的事件结构 phone = event.get("number") otp = random.randint(1000, 10000) result = {"phone": phone, "otp": otp} return { 'statusCode': 200, 'body': json.dumps(result) }
额外排查步骤
- 检查API Gateway集成模式:如果使用的是Lambda代理集成(默认推荐),无需额外映射模板;如果是非代理集成,需要配置映射模板将请求体映射到event的顶层字段(不推荐,代理集成更灵活)。
- 验证Postman请求格式:确保请求Headers中包含
Content-Type: application/json,且请求体是原始JSON格式,而非form-data、x-www-form-urlencoded等其他格式。 - 查看CloudWatch日志:在Lambda函数开头添加
print(json.dumps(event)),然后通过CloudWatch日志查看实际收到的event结构,能直观定位字段位置问题。
内容的提问来源于stack exchange,提问作者Samridh Anand
相关产品推荐
相关产品推荐

