我在AWS API Gateway中设置了一个简单的API。它被设置为通过API网关代理集成调用Python 2.7 lambda函数。
我发现了一个奇怪的错误,因为lambda在本地和lambda测试控制台调用时工作(正确处理了身体并更新了数据库),但没有通过curl或Postman。
事实证明,当通过lambda测试控制台调用时,event['body']
对象将以dict
的形式出现。当通过HTTP客户端调用时,它以字符串形式传递(Unicode
)。
我当然可以解决它,但我想理解它,而且我也更喜欢一个合适的Python对象。我也希望能够使用lambda测试控制台,但目前我不能,因为它以不同的方式传递输入。
我是否缺少配置开关,它会强制API Gateway将请求体(以及所有其他参数)序列化为python dict
或正确的对象?关于传递内容的细节的documentation是稀疏的,说明:
事件 - AWS Lambda使用此参数将事件数据传递给处理程序。此参数通常是Python dict类型。它也可以是list,str,int,float或NoneType类型。
我知道这个模糊内容涵盖了我所看到的内容,但它并没有多大帮助。
答案 0 :(得分:11)
当您在本地或通过Lambda控制台调用lambda时,您直接调用该lambda,因此您的lambda将完全接收您正在发送的内容。
当您通过API网关调用它时,API Gateway会根据您的HTTP请求为您创建event
对象。它添加了HTTP标头,路径,查询字符串,有效负载等。
以下是您从API网关调用中获得event
的内容摘要:
{
"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()
进行解析。