You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:05:31