如何从 aws lambda 事件 object(在 python)中获取 POST 请求的 headers,其中传入请求为空 body,但 [=12 中的信息=]

How to get headers for a POST request from aws lambda event object (in python) where the incoming request has empty body but info in headers

这是关于 google 驱动器 API 集成,其中我有一个 Lambda python 事件代码,当我这样做时会被触发。这是 Google 驱动器 API.

的推送通知实现

为了允许 google 驱动器推送通知呼叫我们,我使用 API 创建了关联的 api 网关端点作为 webhook。现在当我编辑文件时这个 lambda 确实被触发,所以这意味着 webhook 成功并且 google 回调钩子。

Google 一旦您进行了任何更改,驱动器就会将 HTTP POST 消息发送到 webhook url。
以下 HTTP headers 返回空 body 到 lambda 函数:

{
        "Content-Type": "application/json; utf-8",
        "Content-Length": "5000",
        "X-Goog_Channel-ID": "05a349fd-c363-4d8c-9409-8b6f310b7379",
        "X-Goog-Channel-Token": "to66728b-21c7-4605-8445-d7a297b9ae7f",
        "X-Goog-Channel-Expiration": "Fri, 14 Oct 2016 20:05:58 GMT",
        "X-Goog-Resource-ID":  "SuIweVX_iBzKmM5PQVMbIDYFrr8",
        "X-Goog-Resource-URI": "https://www.googleapis.com/drive/v3/files/1QvVo67IJ3_o5g2tCyxpNA29JHx183-bOOblKMoSAGv4?acknowledgeAbuse=false&alt=json",
        "X-Goog-Resource-State":  "update",
        "X-Goog-Changed": "content,properties",
        "X-Goog-Message-Number": "480896"
}

但是,lambda 处理程序的事件 object 是空的。我假设事件 object 是 HTTP body,在我的例子中 body 是空的,所以我在集成请求中添加了自定义映射模板(以检索 headers) API 网关 POST 方法如下:

#set($inputRoot = $input.path('$'))
{
  "Content-Type" : "$input.params('Content-Type')",
  "Content-Length" : "$input.params('Content-Length')",
  "X-Goog-Channel-ID" : "$input.params('X-Goog-Channel-ID')",
  "X-Goog-Channel-Token" : "$input.params('X-Goog-Channel-Token')",
  "X-Goog-Channel-Expiration" : "$input.params('X-Goog-Channel-Expiration')",
  "X-Goog-Resource-ID" : "$input.params('X-Goog-Resource-ID')",
  "X-Goog-Resource-URI" : "$input.params('X-Goog-Resource-URI')",
  "X-Goog-Resource-State" : "$input.params('X-Goog-Resource-State')",

      "X-Goog-Changed" : "$input.params('X-Goog-Changed')",
      "X-Goog-Message-Number" : "$input.params('X-Goog-Message-Number')",
      "body" : $input.json('$')
    }  

但我不确定我应该如何从事件 object 中检索这些 header 如果它们是从 google 驱动器接收到的。仅记录事件 object 将其显示为空 {}。如果以上不正确,预期的映射是什么?另外, event['header-name'] 甚至没有被执行,就像我打印的时候一样 print 'Event header:{}'.format(event['header-name']) 我什至没有在日志中得到 Event header 语句。所以这意味着该行没有执行,但执行了上面的行,这是简单的打印语句,如 print 'Printing results' 我不确定为什么代码没有到达那里或者是否有错误。

能否指导我如何使用 python 中的事件 object 检索 headers?如果我上面的所有步骤看起来都是正确的,还是我遗漏了什么?

我能够毫无问题地完成这项工作。我无法从你的 post 中看出为什么你的活动 object 是空的。我最好的猜测是您忘记将 headers 添加到方法请求的 "HTTP Request Headers" 部分。

这是我的 Lambda 函数:

from __future__ import print_function

import json

print('Loading function')

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))

    print("Content-Type = " + event['Content-Type'])
    print("Content-Length = " + event['Content-Length'])
    print("X-Goog-Channel-ID = " + event['X-Goog-Channel-ID'])
    print("X-Goog-Channel-Token = " + event['X-Goog-Channel-Token'])
    print("X-Goog-Channel-Expiration = " + event['X-Goog-Channel-Expiration'])
    print("X-Goog-Resource-ID = " + event['X-Goog-Resource-ID'])
    print("X-Goog-Resource-URI = " + event['X-Goog-Resource-URI'])
    print("X-Goog-Resource-State = " + event['X-Goog-Resource-State'])
    print("X-Goog-Changed = " + event['X-Goog-Changed'])
    print("X-Goog-Message-Number = " + event['X-Goog-Message-Number'])
    print("body = " + event['body'])

    return {
        'statusCode': '200',
        'body': event['body'],
        'headers': {
            'Content-Type': 'application/json',
            'X-Goog-Channel-ID': event['X-Goog-Channel-ID'],
            'X-Goog-Channel-Token': event['X-Goog-Channel-Token'],
            'X-Goog-Channel-Expiration': event['X-Goog-Channel-Expiration'],
            'X-Goog-Resource-ID': event['X-Goog-Resource-ID'],
            'X-Goog-Resource-URI': event['X-Goog-Resource-URI'],
            'X-Goog-Resource-State': event['X-Goog-Resource-State'],
            'X-Goog-Changed': event['X-Goog-Changed'],
            'X-Goog-Message-Number': event['X-Goog-Message-Number'],
        }
    }

我的映射模板和你的一样。

这是来自测试调用的 return 值,使用与您的示例相同的输入 headers:

{
  "body": "Test input body content",
  "headers": {
    "X-Goog-Resource-ID": "SuIweVX_iBzKmM5PQVMbIDYFrr8",
    "X-Goog-Channel-ID": "",
    "X-Goog-Resource-State": "update",
    "X-Goog-Changed": "content,properties",
    "X-Goog-Resource-URI": "https://www.googleapis.com/drive/v3/files/1QvVo67IJ3_o5g2tCyxpNA29JHx183-bOOblKMoSAGv4?acknowledgeAbuse=false&alt=json",
    "X-Goog-Message-Number": "480896",
    "X-Goog-Channel-Token": "to66728b-21c7-4605-8445-d7a297b9ae7f",
    "Content-Type": "application/json",
    "X-Goog-Channel-Expiration": "Fri, 14 Oct 2016 20:05:58 GMT"
  },
  "statusCode": "200"
}