我正在尝试向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"
}
我的问题:
当您在本地调用lambda或通过lambda控制台调用lambda时,您将直接调用该lambda,这样您的lambda将接收到您发送的消息。
当您通过API网关调用它时,API网关根据您的HTTP请求为您创建
event
对象。它添加HTTP头、路径、查询字符串、负载等以下是从API网关调用获得的
event
摘要:引用: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()
解析它。花了一整天的时间想弄明白这一点后,意识到了以下几点:
我找到的解决方案如下(假设您想访问payload中“type”key的值),不过希望有一个更干净的解决方案:
希望这能帮助别人!
我有更好的建议要测试。
只需返回在lambda_处理程序中接收到的事件。
相关问题 更多 >
编程相关推荐