AWS Lambda函数误解了python中的事件字典?

AWS Lambda函数误解了python中的事件字典?,python,json,amazon-web-services,aws-lambda,aws-api-gateway,Python,Json,Amazon Web Services,Aws Lambda,Aws Api Gateway,我正在尝试将google日历api部署到AWS Lambda。由于我在从事件字典(由lambda从POST请求的JSON负载创建)中提取值时遇到问题,因此我创建了一个玩具函数来测试 def handler(event,context): a=event.get("type") if a=='create': return { "statusCode": 200, "headers": { "Cont

我正在尝试将google日历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”, “类型”:“创建”, “事件标识符”:“pvno”, “摘要”:“公司”, “预订电子邮件”:abc@example.com" }

答复:

{
  "body": "create",
  "headers": {
    "Content-Type": "text/plain"
  },
  "statusCode": 200
}
当我从postman(binary或body POST)(或在API网关控制台上测试)发送相同的负载时,当我从event.get(“type”)返回值时,得到“None”

为了进一步解释,如果我尝试获取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"
}
我的问题是:

  • 我做错了什么
  • 如何从事件字典中获取正确的值
      • 请求被完全打包并作为单个字符串发送到
        事件的
        目录的
        正文
        键中
      • 此行为不同于测试控制台或从CLI调用,后者在
        事件中只有有效负载,意思是
        事件。get('type')
        直接起作用
      显示如何访问
      “type”
      输入有效负载值的示例代码:

      导入json
      def lambda_处理程序(事件、上下文):
      body_str=event.get(“body”,“{}”)
      body_str=body_str如果body_str else“{}”
      body_obj=json.loads(body_str)
      a=主体对象获取(“类型”、“对象”)
      
      当您在本地或通过lambda控制台调用lambda时,您将直接调用该lambda,因此您的lambda将准确地接收您发送的内容

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

      以下是从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"
      }
      
      参考:


      如您所见,
      正文
      将作为
      字符串发送给您,您可以使用
      json.loads()
      对其进行解析。我有一个更好的建议要测试。

      只需返回在lambda_处理程序中接收的事件

      如前所述,AWS对Lamda进行了内部测试,这导致了一个解决方案:在AWS获得完整的post后,您需要使用整个post,您不能像使用curl那样只发送一些json数据

      因此,如果有疑问,您可以在Lambda接收事件时使用

      import json
      
      def lambda_handler(event, context):
      
          return { "statusCode": 200, "body": json.dumps(event, indent=2) }
      
      保存后,此lambda将返回需要粘贴到AWS Lmbda页面上的测试事件中的json