使用Lambda处理GET/POST请求时出现KeyError: 'httpMethod'的解决方法
解决AWS Lambda访问'httpMethod'字段的KeyError问题
错误原因
这个KeyError: 'httpMethod'是因为Lambda收到的event对象里没有httpMethod字段,常见两种情况:
- 直接在Lambda控制台测试时,使用了默认测试事件模板(比如Hello World模板),而非API Gateway格式的事件
- API Gateway和Lambda的集成方式不正确,未传递标准的API Gateway请求事件结构
解决方案
1. 修正测试事件格式
如果是在Lambda控制台测试,必须构造符合API Gateway规范的事件:
- POST请求测试事件:
{ "httpMethod": "POST", "body": "{\"name\": \"Kaira\", \"Phone Number\": 98777}" }
注意:POST的请求体需要是JSON字符串,不能直接放JSON对象,这和API Gateway实际传递的格式一致。
- GET请求测试事件:
{ "httpMethod": "GET", "queryStringParameters": { "name": "Kaira" } }
2. 优化代码健壮性,避免KeyError
修改代码,用dict.get()方法替代直接索引,同时处理各种异常情况:
import boto3 import json dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('ApigatewayDynamo') def lambda_handler(event, context): print("event", event) # 获取请求方法,避免KeyError http_method = event.get('httpMethod') if http_method == 'GET': # 检查查询参数是否存在 query_params = event.get('queryStringParameters') if not query_params or 'name' not in query_params: return { 'statusCode': 400, 'body': json.dumps("缺少必填的name查询参数") } name = query_params['name'] response = table.get_item(Key={'name': name}) # 处理未找到记录的情况 item = response.get('Item') if not item: return { 'statusCode': 404, 'body': json.dumps(f"未找到name为{name}的记录") } return { 'statusCode': 200, 'body': json.dumps(item) } elif http_method == 'POST': # 检查请求体是否存在 request_body = event.get('body') if not request_body: return { 'statusCode': 400, 'body': json.dumps("请求体不能为空") } # 解析JSON请求体,处理格式错误 try: body = json.loads(request_body) except json.JSONDecodeError: return { 'statusCode': 400, 'body': json.dumps("请求体不是合法的JSON格式") } name = body.get('name') if name is None: return { 'statusCode': 400, 'body': json.dumps("请求体缺少必填的name字段") } table.put_item(Item=body) return { 'statusCode': 200, 'body': json.dumps("数据添加成功") } # 处理不支持的请求方法或无效事件 return { 'statusCode': 400, 'body': json.dumps("不支持的请求方法或事件格式错误") }
注:原代码中最后一个return语句缩进错误,被包含在POST的if块内,永远不会执行,已修正为和两个条件判断同级。
3. 检查API Gateway集成设置(如果通过API Gateway触发)
确保API Gateway和Lambda的集成使用Lambda Proxy Integration:
- 在API Gateway的集成请求设置中,勾选"Use Lambda Proxy integration"
- 这种模式下,API Gateway会自动将完整的请求信息(包括httpMethod、queryStringParameters、body等)封装成标准结构传给Lambda,避免自定义集成导致的事件结构缺失问题
内容的提问来源于stack exchange,提问作者Mady
相关产品推荐
相关产品推荐

