AWS Lambda函数在python中曲解了事件字典?

2024-05-16 04:39:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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"
            }

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

测试有效载荷: { “开始时间”:“2018-01-24T09:00:00”, “结束时间”:“2018-01-24T13:00:00”, “type”:“创建”, “事件标识符”:“pvno”, “summary”:“公司”, “预订电子邮件”:“abc@example.com” }

回应:

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

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

为了进一步解释,如果我尝试获取事件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"
}

我的问题:

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

Tags: texteventgettypecreate事件bodycontent
3条回答

当您在本地调用lambda或通过lambda控制台调用lambda时,您将直接调用该lambda,这样您的lambda将接收到您发送的消息。

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

以下是从API网关调用获得的event摘要:

{
    "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()解析它。

花了一整天的时间想弄明白这一点后,意识到了以下几点:

  • 请求实际上是完全打包的,并作为事件dict的“body”键中的单个字符串发送
  • 此行为不同于测试控制台或从CLI调用,CLI在事件dict中只有有效负载意味着event.get('type')直接工作。

我找到的解决方案如下(假设您想访问payload中“type”key的值),不过希望有一个更干净的解决方案:

import json
def lambda_handler(event, context):    
    a=(json.loads(event['body'])).get('type')

希望这能帮助别人!

我有更好的建议要测试。
只需返回在lambda_处理程序中接收到的事件

相关问题 更多 >