如何从AWS Lambda事件对象(在python中)获取POST请求的标头,其中传入请求的主体为空,但标头中的信息

Ati*_*ska 3 python-2.7 aws-lambda aws-api-gateway

这是关于Google Drive API集成的,我有一个Lambda python事件代码,当我这样做时会被触发。这是Google Drive API的推送通知功能。

为了允许Google驱动器推送通知调用我们,我已使用其API将关联的api网关终结点创建为webhook。现在,当我编辑文件时,此lambda确实会被触发,因此这意味着webhook成功并且google回调了该钩子。

进行任何更改后,Google云端硬盘都会将HTTP POST消息发送到webhook网址。
以下HTTP标头以空体返回给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"
}
Run Code Online (Sandbox Code Playgroud)

但是,lambda处理程序的事件对象为空。我假设事件对象是HTTP主体,而在我的情况下,主体为空,因此我在API Gateway POST方法的Integration Request(以检索标头)中添加了自定义映射模板,如下所示:

#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('$')
    }  
Run Code Online (Sandbox Code Playgroud)

但是我不确定如果从Google Drive接收到这些标头,应该如何从事件对象中检索这些标头。仅记录事件对象将其显示为空{}。如果上述不正确,预期的映射是什么?另外,event ['header-name']甚至都没有执行,似乎在我打印时 print 'Event header:{}'.format(event['header-name'])甚至没有在日志中得到Event header语句。因此,这意味着该行不会被执行,而是上面执行的行,这是简单的打印语句,就像print 'Printing results'我不确定为什么代码未到达那里或是否有错误。

您能否指导我如何使用python中的事件对象检索标头?如果我上面的所有步骤看起来都正确,或者我错过了什么?

Mik*_*AWS 7

我能够顺利进行此工作。我不能从您的帖子中得知您的事件对象为何为空。我最好的猜测是您忘记将标头添加到“方法请求”的“ HTTP请求标头”部分。

这是我的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'],
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的映射模板与您的相同。

这是测试调用的返回值,使用示例中的相同输入标头:

{
  "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"
}
Run Code Online (Sandbox Code Playgroud)