gpt4 book ai didi

python-2.7 - 如何从 aws lambda 事件对象(在 python 中)获取 POST 请求的 header ,其中传入请求的正文为空,但 header 中有信息

转载 作者:行者123 更新时间:2023-12-04 02:01:22 25 4
gpt4 key购买 nike

这是关于 google drive API 集成的,其中我有一个 Lambda python 事件代码,当我这样做时会触发。这是谷歌驱动API的推送通知实现。

为了让谷歌驱动推送通知给我们打电话,我使用他们的 API 创建了关联的 api 网关端点作为 webhook。现在,当我编辑文件时会触发这个 lambda,因此这意味着 webhook 成功并且谷歌回调了该钩子(Hook)。

一旦您进行任何更改,Google Drive 就会向 webhook url 发送 HTTP POST 消息。
以下 HTTP header 以空正文返回给 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 处理程序的事件对象是空的。我假设事件对象是 HTTP 主体,在我的情况下主体是空的,所以我在 API Gateway POST 方法的集成请求(检索 header )中添加了自定义映射模板,如下所示:
#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('$')
}

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

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

最佳答案

我能够毫无问题地完成这项工作。我无法从您的帖子中看出为什么您的事件对象为空。我最好的猜测是您忘记将 header 添加到方法请求的“HTTP 请求 header ”部分。

这是我的 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'],
}
}

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

这是测试调用的返回值,使用与您的示例相同的输入 header :
{
"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"
}

关于python-2.7 - 如何从 aws lambda 事件对象(在 python 中)获取 POST 请求的 header ,其中传入请求的正文为空,但 header 中有信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com