Skip to main content
 首页 » 编程设计

python之AWS Lambda 函数在 python 中误解了事件字典

2025年05月04日13飞鱼

我正在尝试将谷歌日历 API 部署到 AWS Lambda。由于我在从事件字典(由 lambda 从 POST 请求的 JSON 负载创建)中提取值时遇到问题,我创建了一个玩具函数来测试

def handler(event,context): 
    a=event.get("type") 
 
    if a=='create': 
        return { 
                "statusCode": 200, 
                "headers": { "Content-Type": "text/plain"}, 
                #"body": "Event_id"+ str(event_identifier) + " Event Link: " +str(links) 
                "body" : str(a) 
            } 
    else: 
        return { 
                "statusCode": 200, 
                "headers": { "Content-Type": "text/plain"}, 
                #"body": "Event_id"+ str(event_identifier) + " Event Link: " +str(links) 
                "body" : "nope" 
            } 

在使用以下 JSON 在 Lambda 控制台上进行测试时,我得到了正确的响应。

测试载荷: { “开始时间”:“2018-01-24T09:00:00”, “结束时间”:“2018-01-24T13:00:00”, “类型”:“创建”, "event_identifier": "pvno", “摘要”:“公司”, “预订邮箱”:“abc@example.com”

响应:

{ 
  "body": "create", 
  "headers": { 
    "Content-Type": "text/plain" 
  }, 
  "statusCode": 200 
} 

当我从 postman (二进制或正文 POST)(或在 API 网关控制台上测试)发送相同的有效负载时,当我从 event.get("type") 返回值时,我得到“无”。

为了进一步解释,如果我尝试获取 event.get('body') 并将其全部作为字符串返回,我将得到以下内容,根据 lambda 事件的工作方式,这是不正确的:

{ 
  "start_time" : "2018-01-24T09:00:00", 
  "end_time" : "2018-01-24T13:00:00", 
  "type": "create", 
  "event_identifier": "pvnoc", 
  "summary": "Company", 
  "booking-email": "abc@example.com" 
} 

我的问题:

  • 我做错了什么?
  • 如何从事件字典中获取正确的值?

请您参考如下方法:

当您在本地或通过 Lambda 控制台调用 lambda 时,您是在直接调用该 lambda,因此您的 lambda 完全接收到您发送的内容。

当您通过 API 网关调用它时,API 网关会根据您的 HTTP 请求为您创建 event 对象。它添加了 HTTP header 、路径、查询字符串、有效负载等。

以下是您从 API 网关调用中作为 事件 获得的内容的摘要:

{ 
    "resource": "Resource path", 
    "path": "Path parameter", 
    "httpMethod": "Incoming request's method name" 
    "headers": {Incoming request headers} 
    "queryStringParameters": {query string parameters } 
    "pathParameters":  {path parameters} 
    "stageVariables": {Applicable stage variables} 
    "requestContext": {Request context, including authorizer-returned key-value pairs} 
    "body": "A JSON string of the request payload." 
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode" 
} 

引用:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

如您所见,body 将作为 string 发送给您,您可以使用 json.loads() 对其进行解析。