我正在尝试将谷歌日历 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”, “类型”:“创建”, "event_identifier": "pvno", “摘要”:“公司”, “预订邮箱”:“abc@example.com”
响应:
{
"body": "create",
"headers": {
"Content-Type": "text/plain"
},
"statusCode": 200
}
当我从 postman (二进制或正文 POST)(或在 API 网关控制台上测试)发送相同的有效负载时,当我从 event.get("type") 返回值时,我得到“无”。
为了进一步解释,如果我尝试获取 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"
}
我的问题:
- 我做错了什么?
- 如何从事件字典中获取正确的值?
请您参考如下方法:
当您在本地或通过 Lambda 控制台调用 lambda 时,您是在直接调用该 lambda,因此您的 lambda 完全接收到您发送的内容。
当您通过 API 网关调用它时,API 网关会根据您的 HTTP 请求为您创建 event 对象。它添加了 HTTP header 、路径、查询字符串、有效负载等。
以下是您从 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"
}
如您所见,body 将作为 string 发送给您,您可以使用 json.loads() 对其进行解析。
